服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jdbmonitor全攻略


        jdbmonitor是一个开源项目。使用它开发者可以很轻松为系统增加数据库执行日志功能。它使用十分方便,您所需要做的唯一事情就是在您系统的jdbc连接字符串前增加类似于 "listenerconfig=/config.xml:url=" 的字符即可,不用写任何代码。

使用 jdbmonitor,您可以把数据库执行情况记录通过各种方式记录下来,比如打印到控制台、输出到文件或者通过socket传送给远程客户端。jdbmonitor是可扩展的,您可以扩展它来将执行情况通过其他方式记录下来,您所需要做的就是写一个实现idblistener接口的类即可。

jdbmonitor遵守 gnu lesser general public licence (lgpl)协议。此协议包含在发行包中。

入门

几乎所有大型数据库应用都包含有自己的sql执行日志功能,此功能不仅能帮助开发人员调试,而且可以为dba(数据库管理员)提供系统的运行信息。

(1)很难将业务逻辑同日志代码分离

(2)降低了代码的可读性。

(3)降低了系统的运行速度。在记录日志的时候,程序会暂停运行等待直到记录完成,而i/o操作是相当耗时的。

(4)很难记录运行耗时、语句参数等其他信息

(5)很难为我们无法修改代码的系统(例如没有源代码的系统)或者很难增加记录日志功能代码的系统(比如系统使用了ormapping)增加日志功能。

jdbmonitor 则不同:

(1)您最多只需要修改一行代码。您需要修改的代码就是这一行:class.forname("com.cownew.jdbmonitor.jdbc.dbdriver") ,然后再修改一下 jdbc连接字符串,只要从 “jdbc:db2://10.74.198.247:50000/app”修改成” listenerconfig=config.xml:url= jdbc:db2://10.74.198.247:50000/app”就可以了。在您使用weblogic ,tomcat或其他服务器的数据源功能的时候,连修改代码这一步都是无需的。

(2)jdbmonitor另起一个线程来记录sql,所以它不会对程序运行速度有任何影响。

(3)它是高度可扩展的,所以您可以扩展它来把执行情况通过其他方式记录。比如,您可以写一个扩展类,来通过电子邮件将日志发送出去。

取得 jdbmonitor

jdbmonitor的最新稳定版本可以在jdbmonitor的网站上取得:

http://www.cownew.com/jdbmonitor

使用 jdbmonitor

1 将 jdbmonitor.jar放到您系统的类路径下。

2 让系统加载 jdbmonitor的jdbc驱动。

这一步将会依您系统加载jdbc驱动的方式的不同而不同。

(1)如果您通过代码的形式加载jdbc驱动,例如:

   class.forname(“com.microsoft.jdbc.sqlserver.sqlserverdriver”);
   connection cn = drivermanager.getconnection(……);

在这种情况下 ,您必须修改 “class.forname”这一句来加载jdbmonitor的jdbc驱动(“com.cownew.jdbmonitor.jdbc.dbdriver”),而非以前的数据库jdbc驱动。

例如:

class.forname(“com.cownew.jdbmonitor.jdbc.dbdriver”);
   connection cn = drivermanager.getconnection(……);

(2)如果您在配置文件中指定jdbc驱动,比如,数据源配置文件或者其他类似的文件。

请修改原来的  jdbc驱动类为 “com.cownew.jdbmonitor.jdbc.dbdriver” 。

3 让 jdbmonitor加载能够加载原来的jdbc驱动

jdbmonitor的工作原理就是截获jdbc驱动的sql语句调用、记录sql语句,然后将sql语句重新转发给原来的jdbc驱动,所以jdbmonitor必须首先向drivermanager注册jdbc驱动。

原来的jdbc驱动定义在配置文件的“jdbcdrivers” 段中。
<jdbcdrivers>
    <jdbcdriver class=" com.mysql.jdbc.driver"/>
  </jdbcdrivers>

4 在原来的jdbc连接字符串前增加 jdbmonitor所需的信息。

您所需要做的就是将” listenerconfig=<configfilepath>:url=” 增加到原来的jdbc连接字符串前。“<configfilepath>”代表配置文件的路径,下面集中路径都是合法的:

/com/jdbmonitor/config.xml
com/jdbmonitor/config.xml
c:/ jdbmonitor /config.xml

jdbmoinitor使用getclass().getresourceasstream加载类似于“/com/jdbmonitor/config.xml” and “com/jdbmonitor/config.xml” 的类路径文件,使用 fileinputstream加载类似于 “c:/ jdbmonitor /config.xml”的配置文件。

5 指定您要使用监听器:

您可以把数据库执行情况记录通过各种方式记录下来,比如打印到控制台、输出到文件或者通过socket传送给远程客户端。

我们已经开发了如下常用的监听器:filedblistener、consoledblistener、 socketdblistene、databasedblistener。当然您也可以开发满足您要求的监听器。
监听器定义在配置文件的 “listeners”段中:

<listeners>
    <!--consoledblistener no arguments-->
    <listener class="com.cownew.jdbmonitor.listenerimpl.consoledblistener" arg=""/>
   
    <!--the arguments of filedblistener is the file to log the sql statement -->
    <listener class="com.cownew.jdbmonitor.listenerimpl.filedblistener" arg="c:/aaa.txt"/>
   
    <!--the arguments of socketdblistener is the bound socket port of the listener server -->
    <listener class="com.cownew.jdbmonitor.listenerimpl.socketdblistener" arg="9527"/>
  </listeners>

搞定!启动您的系统。耶!sql语句被记录下来了,我们可以在控制台、文件甚至远程监视器中看到日志了。

举例

mvnforum的例子:

您可以从http://www.mvnforum.com得到mvnforum。我演示用的版本是1.0。

(1)打开webapp/web-inf/classes/ mvncore.xml,重新配置:

修改之前:

<driver_class_name>com.mysql.jdbc.driver</driver_class_name>
<database_url>listenerconfig=c:/log/jdbmonitor/config.xml:url= jdbc:mysql://localhost/mvnforum?useunicode=true&amp;characterencoding=utf-8</database_url>

修改之后:
<driver_class_name> com.cownew.jdbmonitor.jdbc.dbdriver </driver_class_name>
        <database_url>jdbc:mysql://localhost/mvnforum?useunicode=true&amp;characterencoding=utf-8</database_url>

(2)创建文件 c:/log/jdbmonitor/config.xml。我只想将sql语句记录到文本文件中,所以我做如下配置:
<config>
  <listeners>
    <!--the arguments of filedblistener is the file to log the sql statement -->
    <listener class="com.cownew.jdbmonitor.listenerimpl.filedblistener" arg="c:/log.txt"/>
  </listeners>
  <jdbcdrivers>
    <jdbcdriver class="com.mysql.jdbc.driver"/>
  </jdbcdrivers>
</config>
(3) 将 jdbmonitor.jar放到webapp/web-inf/lib下。
(4) 搞定!

jive的例子:

您可以从http://www.jivesoftware.com得到jive。我演示用的版本是 jive 2.0 beta版。

(1)打开http://localhost:8080/jive/admin/

“jdbc” 填为:com.cownew.jdbmonitor.jdbc.dbdriver

“server” 填为:c:/log/jdbmonitor/config.xml:url=jdbc:mysql://locahost/jive
(2)将 jdbmonitor.jar放到web-inf/lib下
(3) 象mvnforum中一样创建同样的 c:/log/jdbmonitor/config.xml 文件.
(4) 搞定!

代码方式的例子:

尽管直接在代码中指定系统所用的jdbc驱动类名和jdbc连接字符串是不推荐的,但是仍然有系统是这么做的。

比如:

              class.forname("sun.jdbc.odbc.jdbcodbcdriver");
              connection conn = null;
              preparedstatement ps = null;
              try
              {
                     conn = drivermanager
                                   .getconnection("jdbc:odbc:mqis");
                     for (int i = 0; i < 1000; i++)
                     {                   
                            ps = conn.preparestatement("update t_material set fid=fid");
                            ps.execute();
                            ps.close();
                     }
              } finally
              {
                     ....         
              }

(1)修改一下代码为:
               class.forname("com.cownew.jdbmonitor.jdbc.dbdriver");
              connection conn = null;
              preparedstatement ps = null;
              try
              {
                     conn = drivermanager.getconnection("listenerconfig= c:/log/jdbmonitor/config.xml:url=jdbc:odbc:mqis");
                     for (int i = 0; i < 1000; i++)
                     {
                            ps = conn.preparestatement("update t_material set fid=fid");
                            ps.execute();
                            ps.close();
                     }
              } finally
              {
                     ....         
              }

(2)创建c:/log/jdbmonitor/config.xml文件。我想记录sql语句到文本文件中同时输出到控制台,这样可以辅助我进行调试,所以我配置如下:
<config>
  <listeners>
    <!--the arguments of filedblistener is the file to log the sql statement -->
<listener class="com.cownew.jdbmonitor.listenerimpl.filedblistener" arg="c:/log.txt"/>

<!--consoledblistener no arguments-->
<listener class="com.cownew.jdbmonitor.listenerimpl.consoledblistener" arg=""/>
  </listeners>
  <jdbcdrivers>
    <jdbcdriver class="com.mysql.jdbc.driver"/>
  </jdbcdrivers>
</config>
(3) 将 jdbmonitor.jar放到类路径下。
(4) 搞定!

监听器

我们已经开发了如下常用的监听器:filedblistener、consoledblistener、 socketdblistener、databasedblistener。

1、consoledblistener 控制台监听器

consoledblistener会将sql语句打印到控制台中。

jdbmonitor全攻略(图一)

这个监听器很容易配置:

<listener class="com.cownew.jdbmonitor.listenerimpl.consoledblistener" arg=""/>

2、filedblistener 文件监听器

filedblistener 会将sql语句保存到文本文件中。

jdbmonitor全攻略(图二)

如下配置:

<listener class="com.cownew.jdbmonitor.listenerimpl.filedblistener" arg="c:/aaa.txt"/>

arg="c:/aaa.txt"表示日志将保存到文件c:/aaa.txt中。

3、socketdblistener socket监听器

socketdblistener是一个socket服务器,客户端连接到它上边以后就可以接收到它发出的sql语句。

如下配置:

<listener class="com.cownew.jdbmonitor.listenerimpl.socketdblistener" arg="9527"/>

arg="9527"表示服务器将在9527端口监听。

我们已经开发了如下两种客户端:socketconsoleclient(socket控制台客户端) 和 socketswingclient(socket swing客户端)。

socketconsoleclient工作在控制台中:

jdbmonitor全攻略(图三)

点击查看大图

socketswingclient是一个swing gui客户端:

jdbmonitor全攻略(图四)

您可以运行"java -classpath jdbmonitor.jar com.cownew.jdbmonitor.listenerimpl.scklistenerclient.socketconsoleclient" 来启动socketconsoleclient,运行"java -classpath jdbmonitor.jar com.cownew.jdbmonitor.listenerimpl.scklistenerclient.socketswingclient"启动socketswingclient

您可以编写符合您自己要求的客户端,具体细节请参考com.cownew.jdbmonitor.listenerimpl.scklistenerclient.listenerclientcom.cownew.jdbmonitor.listenerimpl.scklistenerclient.idbsocketclientlistener.

4、databasedblistener

databasedblistener将会把sql语句记录到数据库中:

jdbmonitor全攻略(图五)

点击查看大图

如下配置:

<listener class="com.cownew.jdbmonitor.listenerimpl.databasedblistener"
arg="dburl=jdbc:odbc:mqis;user=;password=;logtable=t_log_sqllog"/>

"dburl=jdbc:odbc:mqis;user=;password=;"表示目标数据库的jdbc连接字符串。"logtable=t_log_sqllog" 表示sql记录将被保存到哪个表中,默认的是t_log_sqllog

如果目标数据库用的jdbc驱动与被监控的数据库不同,请将它加入配置文件的 "jdbcdrivers" 部分,例如:

<config>
<active>true</active>
<listeners>

<listener class="com.cownew.jdbmonitor.listenerimpl.consoledblistener" arg=""/>

<listener class="com.cownew.jdbmonitor.listenerimpl.databasedblistener"
arg="dburl=jdbc:odbc:mqis;user=;password=;logtable=t_log_sqllog"/>
</listeners>
<jdbcdrivers>
<jdbcdriver class="com.microsoft.jdbc.sqlserver.sqlserverdriver"/>
<jdbcdriver class="sun.jdbc.odbc.jdbcodbcdriver"/>
</jdbcdrivers>
</config>

"t_log_sqllog"的结构是:

jdbmonitor全攻略(图六)

"t_log_sqllog"的建库脚本在com/cownew/jdbmonitor/listenerimpl/databaselistener,(db2.sql,mssqlserver.sql,oracle.sql)。

databasedblistener是跨数据库的,你可以把记录sql到任何关系数据库中。

faq:

1 如果我暂时不想记录sql语句执行怎么办?难道我要重新修改成原来的样子?

答:无须如此。您只要修改config.xml,增加<active>false</active>到文件中即可。

如下:

<config>
  <active> false </active>
  <listeners>
......
</config>

如何扩展jdbmonitor?

我们已经开发了如下常用的监听器:filedblistener、consoledblistener、 socketdblistener、databasedblistener。当然您也可以开发满足您要求的监听器。所有的监听器必须实现接口:com.cownew.jdbmonitor.commo. idblistener。idblistener有两个方法需要实现:

public void init(string arg);
public void logsql(sqlinfo info);

jdbmonitor会将配置文件中监听器定义中“arg”的值传递给 “init”方法、将代表sql语句执行信息的sqlinfo传递给“logsql”方法。

更多信息请参考api文档。

扫描关注微信公众号