給Domino插上連接池的翅膀(一)--JnpServer實現

Domino平臺與關係型數據庫的集成,通常是用LEI、DECS 或ODBC、JDBC。在Domino901平臺上的XPages Extension Library 中增加了連接池的支持,但是必須是在Xpage中用。筆者覺得連接池沒那麼複雜的技術,不需要限定在某個平臺上。因此,筆者一直在研究如何在Domino平臺上實現Tomcat、Webshpere、weblogic上才具有的連接池功能。功夫不負有心人,雖說前途有險阻,畢竟只要肯登攀。只有想不到的,沒有做不到的。


做過J2EE平臺應用程序的讀者應該都知道,在Tomcat,weblogic這些應用服務器平臺上都支持配置連接池的功能。Tomcat默認是DBCP 也可以換成C3P0等其他開源的連接池。在這些應用服務器上之所以能運行連接池是因爲他們有JnpServer這樣的容器。筆者在之前的文章中向大家介紹了在Domino平臺上如何集成JnpServer,其實筆者想實現的是如何在Domino平臺上運行連接池。有人一定會說,Xpage中已經有這個功能了,你還瞎折騰啥?沒有折騰就沒有進步,而且除了容納連接池,JnpServer還能幹很多其他事情,只需要讀者動動腦。閒言少敘,進入正題。那麼如何做才能在JnpServer上運行連接池那?


首先要運行JnpServer,請參閱本文末尾的相關文章。筆者此次集成的是C3P0連接池,當然也可以是其他開源的連接池產品。其次,準備運行C3P0所需要的Jar包。這點頗爲惱人,一般開源產品都有的毛病就是依賴其他開源的產品,而且還不告訴你。筆者爲了啓動C3P0,前前後後找了5個Jar包,都是在運行的時候報錯誤,才知道需要找哪些類,繼而尋找缺失的Jar包。爲了順利運行連接池,筆者也只好忍耐。所有的Jar包都準備齊全了,放到JVM的ext目錄下。看過筆者前幾篇介紹JnpServer的讀者應該知道怎麼做,這裏筆者就不介紹了。還是用那段代碼,啓動JnpSever後,要編寫初始化連接池的代碼:

Class.forName(jnpconfig.getDriverclass());
DataSource unpooled = DataSources.unpooledDataSource(jnpconfig.getJdbcurl(), jnpconfig.getUser(),jnpconfig.getPassword());
DataSource pooled = DataSources.pooledDataSource(unpooled);
ctx = new InitialContext();
ctx.rebind(jnpconfig.getJndiname(), pooled);

在服務器端正常啓動C3P0,應顯示如下信息:
2015/07/08 13:21:48   RunJava JVM: starting DominoJnpserver...
2015/07/08 13:21:48   RunJava JVM: 正在啓動JnpServer...
2015/07/08 13:21:48   RunJava JVM: JNPDataSource:oracle.jdbc.driver.OracleDriver
2015/07/08 13:21:49   RunJava JVM: JnpServer啓動完畢。
2015/07/08 13:21:49   RunJava JVM: driverclass:oracle.jdbc.driver.OracleDriver
2015/07/08 13:21:50   RunJava JVM: 13:21:50,375 INFO  [MLog] MLog clients using slf4j logging.
2015/07/08 13:21:50   RunJava JVM: 13:21:50,589 INFO  [C3P0Registry] Initializing c3p0-0.9.5 [built 02-January-2015 13:25:04 -0500; debug? true; trace: 10]

如果一切順利,那麼此時連接池的服務器端已經正常運行,只需要用戶在客戶端編寫取出連接池的代碼就可以正常工作了。這裏所謂的客戶端是指在代理、Servlet、Xpage、WebService中調用連接池。其實寫法也很簡單,完全可以參照J2EE平臺上獲取連接池的代碼。比如:

InitialContext ctx = new InitialContext(props);
DataSource ds = (DataSource) ctx.lookup(sjndiname);
con = ds.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery("select * from TESTDATA t");
while (rs.next()) {
                System.out.println(rs.getString(1));
}


既然是運行在Domino平臺上,那麼那些XML配置文件中的參數,也要按慣例,改成Domino數據庫裏配置,如圖:

配置完成後,在Web端調用        代理運行,能正常輸出Oracle表中內容,即可表明:連接池能正常工作。在Oracle中表數據如圖:


到此,C3P0連接池運行正常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章