给Domino插上连接池的翅膀(一)--JnpServer实现

来源:互联网 发布:孕囊后两个数据一样 编辑:程序博客网 时间:2024/06/05 04:41
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连接池运行正常。

0 0