立夏诗词大全:P6Spy的应用实践
来源:百度文库 编辑:中财网 时间:2024/04/29 14:32:29
oracle 学习(2)-sql语句拦截(跟踪)
2011-04-17 23:31:28| 分类: 工作学习 | 标签:数据库 oracle |字号 订阅
一、问题的引出
在我们 Java 开发应用程序的过程中,难免会碰到系统的性能问题,特别在企业应用的开发过程中,都会与数据库进行打交道。当我们碰到数据库性能时,最有效的就是直接跟踪每一个 SQL 语句的执行情况,SQL 语句的优化、索引的优化往往也是最容易取得最直接的效果的。另外,作为测试人员,也有了解SQL语句执行的需求。那么在只执行页面操作,就能获得相关操作具体执行的SQL语句呢?由此,我们引出了SQL语句跟踪(拦截)问题。此专业介绍P6Spy 这个剖析工具,看它是如何无侵入性地进行数据库操作的监控与剖析。
二、 问题的进一步理解
软件的架构一般为: Clients->Application Servers->Database Servers, 其中客户端就是大量的用户,它们经过TCP(其上的协议可以为:HTTP, RMI, IIOP,Texedo, CICS等)连接到Application Servers;Application Servers在于千兆的速度与数据库进行连接(传输的则为SQL)。
三、P6spy的介绍
P6Spy 是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架。通过 P6Spy 我们可以对 SQL 语句进行拦截,相当于一个 SQL 语句的记录器,这样我们可以用它来作相关的分析,比如性能分析。P6Spy 用 Log4J 来记录 JDBC 调用的日记信息。
1. P6Spy架构原理
简单地讲,我们可以认为 P6Spy 就是一个代理(Proxy),它只做了一层对 JDBC 驱动的拦截,然后转发出去,这样的设计与实际的应用程序没有任何的耦合性,除了在配置中将驱动程序改成 P6Spy 的拦截驱动外,程序其他地方并不需要做任何的改变。这层拦截器除了可能会给系统带来略微的性能下降外,对程序其他方面没有任何的影响。而相对于这一点点的性能下降,在开发环境中对于开发人员来说是无法感觉到,相比它所带来的好处,完全可以忽略不计。
P6Spy 支持 WebSphere、WebLogic、JBoss、Resin 和 Tomcat 等绝大多数的应用服务器。
图 1. P6Spy 对数据库进行拦截监控的处理过程
2. 使用步骤
首先,你的应用系统应当是基于数据库的,然后你需要去获取 P6Spy 相关的文件。
下面介绍 P6Spy 的安装与使用的详细操作过程:
- 下载P6Spy 的文件包,也可以下载它的源文件包来研究;
- 把 P6Spy 的 jar 包 p6spy.jar 放到
CLASSPATH
中,如果是 Web 应用程序则放在YourWebApp/WEB-INF/lib/
目录下; - 把 spy.properties 放到
CLASSPATH
目录下,如果是 Web 应用程序放在YourWebApp/WEB-INF/classess/
目录下,注意不是lib/
目录 - 修改你应用系统中的数据库驱动名称为 P6Spy 的驱动程序名称
com.p6spy.engine.spy.P6SpyDriver
其它的全部使用默认值,暂时先都不用修改; - 打开配置文件 spy.properties 文件,找到
realdriver
,把它的值改为你的应用系统的真正的数据库驱动名称;
找到 # realdriver=oracle.jdbc.driver.OracleDriver 把前面的 # 注释符去掉,因为我们用的是 Oracle 数据库,即改为
realdriver=oracle.jdbc.driver.OracleDriver
同时把 realdriver=org.gjt.mm.mysql.Driver 用 # 注释掉,即改为
# realdriver=org.gjt.mm.mysql.Driver
运行你的应用程序或 Web 应用程序,可以在 spy.log 里看到 P6Spy 监测到的 SQL 详细的执行与操作的记录信息了,包含有完整的 SQL 执行参数。
四、应用实践
利用Tomcat 做P6Spy的应用实践练习
编写一个简单的web应用服务,利用jsp脚本,编写一个通过表单提交查询数据库表中的数据,并显示在页面中
A. 01.jsp 通过表单提交查询条件给testoracle.jsp;
B. Testoracle.jsp通过jdbc操作数据库qc_db 中的tdz表
脚本文件01.jsp
利用表单传递数据
这里演示的是利用p6spy查询应用程序执行的sql语句,执行后可打开c:/spy.log查看sql语句
查询的表是:qc_db.tdz
调用路径:01.jsp --》testoracle.jsp
================================================
脚本文件01.jsp<%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%>
<%Class.forName(" oracle.jdbc.driver.OracleDriver ").newInstance();
//这里就是将来需求配置更改的地方,由原来的jdbc 驱动,修改为p6spy驱动//com.p6spy.engine.spy.P6SpyDriver
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为你的数据库的SID
String user="qc_db";
String password="qcdb";
String id= request.getParameter("id");
out.println("你输入的序号是:"+id+"
");
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql2="insert into test_table values('1','luyx')";
stmt.executeUpdate(sql2);
conn.commit();
String sql="select * from tdz where vjsztm='"+id+"'";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next())
{%> 您的第一个字段内容为:<%=rs.getString(1)%> 您的第二个字段内容为:<%=rs.getString(2)%> <%}%> <%out.print("数据库操作成功,恭喜你");%> <%rs.close(); stmt.close(); conn.close(); %> QC_DB.TDZ表结构 -- Create table
create table TDZ
(
VJSZTM VARCHAR2(100),
VXM VARCHAR2(100),
VXB VARCHAR2(100),
VZY VARCHAR2(100),
VBJ VARCHAR2(100),
VDZLX VARCHAR2(100)
)
创建表后并插入一些数据
1. 准备好以上文件和数据后,在Tomcat下下发布jsp应用服务。输入查询条件,能够正常运行
2. 通过配置“P6Spy介绍—使用步骤”的方法进行配置,注意将log文件放在C盘下(当然你也可以更换存放地址),重启Tomcat服务。
3. 进行查询,你则可在log文件中看到类似以下的日志内容
");
create table TDZ
(
VJSZTM VARCHAR2(100),
VXM VARCHAR2(100),
VXB VARCHAR2(100),
VZY VARCHAR2(100),
VBJ VARCHAR2(100),
VDZLX VARCHAR2(100)
)
创建表后并插入一些数据