<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

    CowNew開源團(tuán)隊(duì)

    http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks
    JDBMonitor是一個(gè)開源項(xiàng)目。使用它開發(fā)者可以很輕松為系統(tǒng)增加數(shù)據(jù)庫執(zhí)行日志功能。它使用十分方便,您所需要做的唯一事情就是在您系統(tǒng)的JDBC連接字符串前增加類似于 "listenerconfig=/config.xml:url=" 的字符即可,不用寫任何代碼。

    使用 JDBMonitor,您可以把數(shù)據(jù)庫執(zhí)行情況記錄通過各種方式記錄下來,比如打印到控制臺(tái)、輸出到文件或者通過socket傳送給遠(yuǎn)程客戶端。JDBMonitor是可擴(kuò)展的,您可以擴(kuò)展它來將執(zhí)行情況通過其他方式記錄下來,您所需要做的就是寫一個(gè)實(shí)現(xiàn)IDBListener接口的類即可。

    JDBMonitor遵守 GNU Lesser General Public Licence (LGPL)協(xié)議。此協(xié)議包含在發(fā)行包中。

    入門

    幾乎所有大型數(shù)據(jù)庫應(yīng)用都包含有自己的SQL執(zhí)行日志功能,此功能不僅能幫助開發(fā)人員調(diào)試,而且可以為DBA(數(shù)據(jù)庫管理員)提供系統(tǒng)的運(yùn)行信息。

    (1)很難將業(yè)務(wù)邏輯同日志代碼分離

    (2)降低了代碼的可讀性。

    (3)降低了系統(tǒng)的運(yùn)行速度。在記錄日志的時(shí)候,程序會(huì)暫停運(yùn)行等待直到記錄完成,而I/O操作是相當(dāng)耗時(shí)的。

    (4)很難記錄運(yùn)行耗時(shí)、語句參數(shù)等其他信息

    (5)很難為我們無法修改代碼的系統(tǒng)(例如沒有源代碼的系統(tǒng))或者很難增加記錄日志功能代碼的系統(tǒng)(比如系統(tǒng)使用了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或其他服務(wù)器的數(shù)據(jù)源功能的時(shí)候,連修改代碼這一步都是無需的。

    (2)JDBMonitor另起一個(gè)線程來記錄SQL,所以它不會(huì)對(duì)程序運(yùn)行速度有任何影響。

    (3)它是高度可擴(kuò)展的,所以您可以擴(kuò)展它來把執(zhí)行情況通過其他方式記錄。比如,您可以寫一個(gè)擴(kuò)展類,來通過電子郵件將日志發(fā)送出去。

    取得 JDBMonitor

    JDBMonitor的最新穩(wěn)定版本可以在JDBMonitor的網(wǎng)站上取得:

    http://www.cownew.com/JDBMonitor

    使用 JDBMonitor

    1 將 jdbmonitor.jar放到您系統(tǒng)的類路徑下。

    2 讓系統(tǒng)加載 JDBMonitorJDBC驅(qū)動(dòng)。

    這一步將會(huì)依您系統(tǒng)加載JDBC驅(qū)動(dòng)的方式的不同而不同。

    (1)如果您通過代碼的形式加載JDBC驅(qū)動(dòng),例如:

    ?? Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);
    ?? Connection cn = DriverManager.getConnection(……);

    在這種情況下 ,您必須修改 “Class.forName”這一句來加載JDBMonitor的JDBC驅(qū)動(dòng)(“com.cownew.JDBMonitor.jdbc.DBDriver”),而非以前的數(shù)據(jù)庫JDBC驅(qū)動(dòng)。

    例如:

    Class.forName(“com.cownew.JDBMonitor.jdbc.DBDriver”);
    ?? Connection cn = DriverManager.getConnection(……);

    (2)如果您在配置文件中指定JDBC驅(qū)動(dòng),比如,數(shù)據(jù)源配置文件或者其他類似的文件。

    請(qǐng)修改原來的??JDBC驅(qū)動(dòng)類為 “com.cownew.JDBMonitor.jdbc.DBDriver” 。

    3 讓 JDBMonitor加載能夠加載原來的JDBC驅(qū)動(dòng)

    JDBMonitor的工作原理就是截獲JDBC驅(qū)動(dòng)的SQL語句調(diào)用、記錄SQL語句,然后將SQL語句重新轉(zhuǎn)發(fā)給原來的JDBC驅(qū)動(dòng),所以JDBMonitor必須首先向DriverManager注冊(cè)JDBC驅(qū)動(dòng)。

    原來的JDBC驅(qū)動(dòng)定義在配置文件的“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 指定您要使用監(jiān)聽器:

    您可以把數(shù)據(jù)庫執(zhí)行情況記錄通過各種方式記錄下來,比如打印到控制臺(tái)、輸出到文件或者通過socket傳送給遠(yuǎn)程客戶端。

    我們已經(jīng)開發(fā)了如下常用的監(jiān)聽器:FileDBListener、ConsoleDBListener、 SocketDBListene、DataBaseDBListener。當(dāng)然您也可以開發(fā)滿足您要求的監(jiān)聽器。
    監(jiān)聽器定義在配置文件的 “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>

    搞定!啟動(dòng)您的系統(tǒng)。耶!SQL語句被記錄下來了,我們可以在控制臺(tái)、文件甚至遠(yuǎn)程監(jiān)視器中看到日志了。

    舉例

    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)創(chuàng)建文件 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下
    (4) 象mvnforum中一樣創(chuàng)建同樣的 c:/log/jdbmonitor/config.xml 文件.
    (4) 搞定!

    代碼方式的例子:

    盡管直接在代碼中指定系統(tǒng)所用的JDBC驅(qū)動(dòng)類名和JDBC連接字符串是不推薦的,但是仍然有系統(tǒng)是這么做的。

    比如:

    ????????????? 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)創(chuàng)建c:/log/jdbmonitor/config.xml文件。我想記錄SQL語句到文本文件中同時(shí)輸出到控制臺(tái),這樣可以輔助我進(jìn)行調(diào)試,所以我配置如下:
    <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) 搞定!

    監(jiān)聽器

    我們已經(jīng)開發(fā)了如下常用的監(jiān)聽器:FileDBListener、ConsoleDBListener、 SocketDBListener、DataBaseDBListener。

    1、ConsoleDBListener 控制臺(tái)監(jiān)聽器

    ConsoleDBListener會(huì)將SQL語句打印到控制臺(tái)中。

    這個(gè)監(jiān)聽器很容易配置:

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

    2、FileDBListener 文件監(jiān)聽器

    FileDBListener 會(huì)將SQL語句保存到文本文件中。

    如下配置:

    <Listener class="com.cownew.JDBMonitor.listenerImpl.FileDBListener" arg="c:/aaa.txt"/>

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

    3、SocketDBListener Socket監(jiān)聽器

    SocketDBListener是一個(gè)socket服務(wù)器,客戶端連接到它上邊以后就可以接收到它發(fā)出的SQL語句。

    如下配置:

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

    arg="9527"表示服務(wù)器將在9527端口監(jiān)聽。

    我們已經(jīng)開發(fā)了如下兩種客戶端:SocketConsoleClient(Socket控制臺(tái)客戶端) 和 SocketSwingClient(Socket Swing客戶端)。

    SocketConsoleClient工作在控制臺(tái)中:

    SocketSwingClient是一個(gè)Swing GUI客戶端:

    您可以運(yùn)行"java -classpath jdbmonitor.jar com.cownew.JDBMonitor.listenerImpl.sckListenerClient.SocketConsoleClient" 來啟動(dòng)SocketConsoleClient,運(yùn)行"java -classpath jdbmonitor.jar com.cownew.JDBMonitor.listenerImpl.sckListenerClient.SocketSwingClient"啟動(dòng)SocketSwingClient

    您可以編寫符合您自己要求的客戶端,具體細(xì)節(jié)請(qǐng)參考com.cownew.JDBMonitor.listenerImpl.sckListenerClient.ListenerClientcom.cownew.JDBMonitor.listenerImpl.sckListenerClient.IDBSocketClientListener.

    4、DataBaseDBListener

    DataBaseDBListener將會(huì)把SQL語句記錄到數(shù)據(jù)庫中:

    如下配置:

    <Listener class="com.cownew.JDBMonitor.listenerImpl.DataBaseDBListener"
    arg="dburl=jdbc:odbc:MQIS;user=;password=;logtable=T_Log_SQLLog"/>

    "dburl=jdbc:odbc:MQIS;user=;password=;"表示目標(biāo)數(shù)據(jù)庫的JDBC連接字符串。"logtable=T_Log_SQLLog" 表示SQL記錄將被保存到哪個(gè)表中,默認(rèn)的是T_Log_SQLLog

    如果目標(biāo)數(shù)據(jù)庫用的JDBC驅(qū)動(dòng)與被監(jiān)控的數(shù)據(jù)庫不同,請(qǐng)將它加入配置文件的 "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"的結(jié)構(gòu)是:

    "T_Log_SQLLog"的建庫腳本在com/cownew/JDBMonitor/listenerImpl/dataBaseListener,(db2.sql,mssqlserver.sql,oracle.sql)。

    DataBaseDBListener是跨數(shù)據(jù)庫的,你可以把記錄SQL到任何關(guān)系數(shù)據(jù)庫中。

    FAQ:

    1 如果我暫時(shí)不想記錄SQL語句執(zhí)行怎么辦?難道我要重新修改成原來的樣子?

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

    如下:

    <config>
    ? <Active> false </Active>
    ? <Listeners>
    ......
    </config>

    如何擴(kuò)展JDBMonitor?

    我們已經(jīng)開發(fā)了如下常用的監(jiān)聽器:FileDBListener、ConsoleDBListener、 SocketDBListener、DataBaseDBListener。當(dāng)然您也可以開發(fā)滿足您要求的監(jiān)聽器。所有的監(jiān)聽器必須實(shí)現(xiàn)接口:com.cownew.JDBMonitor.commo. IDBListener。IDBListener有兩個(gè)方法需要實(shí)現(xiàn):

    public void init(String arg);
    public void logSql(SQLInfo info);

    JDBMonitor會(huì)將配置文件中監(jiān)聽器定義中“arg”的值傳遞給 “init”方法、將代表SQL語句執(zhí)行信息的SQLInfo傳遞給“l(fā)ogSql”方法。

    更多信息請(qǐng)參考API文檔。

    posted on 2006-05-14 21:42 CowNew開源團(tuán)隊(duì) 閱讀(2491) 評(píng)論(2)  編輯  收藏

    評(píng)論

    # re: 10秒為任意數(shù)據(jù)庫增加執(zhí)行日志功能:JDBMonitor全攻略 2006-05-15 09:43 山顛
    看起來和P6spy類似.  回復(fù)  更多評(píng)論
      

    # re: 10秒為任意數(shù)據(jù)庫增加執(zhí)行日志功能:JDBMonitor全攻略 2007-02-25 18:16 BeanSoft
    不錯(cuò), 好東西, 支持一下先!  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: mm1313亚洲精品无码又大又粗| 亚洲人成人无码.www石榴| 韩国免费三片在线视频| 男人进去女人爽免费视频国产 | 免费国产成人18在线观看| 亚洲AV无码资源在线观看| 亚洲人成网站日本片| 亚洲AV无码乱码国产麻豆穿越 | 亚洲成AV人影片在线观看| 亚洲精品在线免费看| 亚洲国产精品乱码一区二区| 亚洲欧洲自拍拍偷精品 美利坚| 精品国产免费观看一区| 毛片a级毛片免费观看品善网| 99在线观看视频免费| 久久免费视频观看| 中文字幕无码一区二区免费| 国产免费黄色无码视频| 国产福利在线观看永久免费| 理论片在线观看免费| 爱情岛亚洲论坛在线观看 | 国产成人精品免费视频软件| 女人18一级毛片免费观看| 久久久久免费看黄A片APP| 114一级毛片免费| 国产成人精品免费视频动漫| 91大神免费观看| 久久久久久曰本AV免费免费| 国产曰批免费视频播放免费s | 最新亚洲卡一卡二卡三新区| 亚洲一区电影在线观看| 亚洲另类精品xxxx人妖| 亚洲av永久无码嘿嘿嘿| 在线观看亚洲AV每日更新无码| 亚洲熟女综合一区二区三区| 亚洲国产成人无码AV在线| 性色av极品无码专区亚洲| 免费看一级一级人妻片| 国产激情久久久久影院老熟女免费 | 一级毛片免费观看不卡的| 免费在线看黄网站|