每日一得

          不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發
          最近關心的內容:SSH,seam,flex,敏捷,TDD
          本站的官方站點是:顛覆軟件

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            220 隨筆 :: 9 文章 :: 421 評論 :: 0 Trackbacks
          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語句打印到控制臺中。

          這個監聽器很容易配置:

          <Listener class="com.cownew.JDBMonitor.listenerImpl.ConsoleDBListener" arg=""/>

          2、FileDBListener 文件監聽器

          FileDBListener 會將SQL語句保存到文本文件中。

          如下配置:

          <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工作在控制臺中:

          SocketSwingClient是一個Swing GUI客戶端:

          您可以運行"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語句記錄到數據庫中:

          如下配置:

          <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"的結構是:

          "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文檔。

          posted on 2006-08-31 10:59 Alex 閱讀(1595) 評論(0)  編輯  收藏 所屬分類: dataBase
          主站蜘蛛池模板: 丰都县| 汕尾市| 石棉县| 东乡县| 庆阳市| 台江县| 拉孜县| 商丘市| 福鼎市| 龙游县| 健康| 郴州市| 论坛| 巨野县| 苗栗县| 张家界市| 伊春市| 项城市| 惠州市| 增城市| 铜鼓县| 仙游县| 商都县| 双鸭山市| 方城县| 本溪市| 丽江市| 德格县| 江西省| 锦州市| 麟游县| 遂川县| 青冈县| 开阳县| 佳木斯市| 康马县| 肃北| 丹寨县| 涞水县| 通化市| 泾阳县|