CSDN博客

img lwqadmin

Connection Pooling Proxool

发表于2004/10/10 16:53:00  1460人阅读

分类:

第21期-Connection Pooling Proxool


作者:jini         来源:java 公开原始码报
申明:未经作者同意,谢绝转载

Proxool
( ASF )
JCP ( Java Community Process ) 是负责 Java Spec 标准的制定, Reference Implementations( RI: 实现参考 ), Technology Compatibility kits ( 技术兼容性测试 )的公开组织, 所有和 Java 有关的公司, SUN, IBM, BEA, Oracle, SAP, HP 等等, 要制定相关的标准都会来这里提案, 那么经过公开讨论, 投票, 得到的结果, 就是相互努力下创造出的结晶.


为何标准非常重要, 因为没有标准的东西, 兼容性的部分非常薄弱, 各家厂商彼此实现出来的产品, 将会造成系统整合沉重的负担, 因此, 我以沉重的心情建议大家, 如果你发现你做的东西, 和标准不符合, 或者有相同类似功能的标准, 更是应该减少重新造轮的时间, 还有, 昙花一现的作品, 更是让未来的维护人员最难过的地方.


凡事都有例外, 有些比标准还要早出来, 或者领先标准的东西, 都是可以去学习的, 例如 log4j 远比 jdk logging 好用, hibernate 可以与 ejb 抗衡, 这种例子非常地多, 但是都有同一个特点, 就是 opensource, 就是因为 opensource , 才能吸引更多优秀的人来加强, 来创造 !


回到这周主题, connection pooling 的实现, 很多人都搞不清楚 connection pooling 该如何真正实现, 目前比较有名的 db connection pool 的项目有 jakarta commons-dbcp, PoolMan, RP Database Connection Pool 等等, 以及这次要介绍的 proxool, 被用在许多项目中, 最有名的就是强大 OR-Mapping 的项目 Hibernate 及 JMS 的专案 OpenJMS 所采用 ~.


增加 license 说明, 相关细节请参考 license 解说 [by Tempo]

ps:如果要赞助本电子报发行, 请与我们联络->Johnny
本周主题 -- proxool



SECTION 01 为何需要 connection pooling

当我们进入了 Java 的开发世界, pool 也是一门学问, 如何让 connection 先建立好与 DB 的连结, 后来的人可以使用已经存在于 pool 的 connection, 减少连结的时间, 这么优秀的功能, 在许多 application server 都已经实现好了, 你只要简单地按照说明文件配置, 包括最大连结数量, 初始连结数量, 最大等待数量等等的参数, 当然, Tomcat 也有内建 commons-dbcp 相关的 connection pooling 机制, 请查阅 Tomcat JNDI Datasource 设定!!


而 proxool 是一个强大的 connection pooling 项目, 兼容于 jdk 1.3 以及 1.4. 也已经实现了 监控, 纪录等等的功能, 对于一个有限制 connection 数量, 及注重 performation 的项目来说, 是一套非常完整的解决方案.

下载区, 目前版本 0.7.2

http://sourceforge.net/projects/proxool/


SECTION 02 设置 AdminServlet

首先, 你要把下载 proxool 的 lib 下面所有的 jar 文件, 放到 WEB-INF/lib 下面,

另外, 把你的 jdbc driver 也放到相同的 lib,

接著就是配置 /WEB-INF/web.xml

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app 
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"/WEB-INF/dtds/web-app_2_3.dtd">
<web-app>
<display-name>proxool</display-name>
<servlet>
  <servlet-name>Admin</servlet-name>
  <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>Admin</servlet-name>
  <url-pattern>/admin</url-pattern>
</servlet-mapping> 

</web-app>



SECTION 03 通过 ProxoolDriver 取得 connection

建立一个 jsp or DAO Bean, 通过 org.logicalcobwebs.proxool.ProxoolDriver 建立 Connection



test.jsp

<%@page import="java.sql.*"%>
<%
Connection connection = null;
try {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");

connection = DriverManager.getConnection(
"proxool.test:org.gjt.mm.mysql.Driver:jdbc:mysql://localhost:3306/test",
"root",
"password"
);
} catch (Exception e) {
	out.println(e)
}
out.println("OK");
%>



SECTION 04 检视 pooling 现在状态

执行 http://localhost:8080/proxool-test/admin ( proxool-test 是你的应用名称 ) 如果没有任何 pool 状态的时候, 你只会看到 Pools 这几个字, 所以你先执行 http://localhost:8080/proxool-test/test.jsp 建立一个 connection, 就可以监控 connection pooling 的状态了.

Pools
> test -> jdbc:mysql://www:3306/test

Defintition for test
URL jdbc:mysql://localhost:3306/test
Driver org.gjt.mm.mysql.Driver
Connections 0 (min), 15 (max)
Prototyping off
Connection Lifetime 11:00:00
Maximum active time 07:05:00
House keeping sleep time 30s
House keeping test SQL off
Fatal SQL exceptions off
Statistics off

Snapshot at 21:12:53
Start date 01-??-2003 21:12:30
Connections 1 (active), 0 (available), 15 (max)
   
Served 1
Refused 0
Details
# born last
start
lap
(ms)
 thread
1  21:12:31  21:12:31 22432    Thread-15
less information

Proxool 0.7.2 (29-Apr-2003 00:33)



SECTION 05 使用 properties 或者 xml 来设置 DB URL 及 Driver

可以采用 xml 配置文件, 在程序中使用 JAXPConfigurator.configure("proxool.xml", false); 配置文件设置如下

WEB-INF/proxool.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
  <proxool>
    <alias>xml-test</alias>
    <driver-url>jdbc:mysql://localhost:3306/test</driver-url>
    <driver-class>org.gjt.mm.mysql.Driver</driver-class>
    <driver-properties>
      <property name="user" value="root"/>
      <property name="password" value="password"/>
    </driver-properties>
    <maximum-connection-count>10</maximum-connection-count>
    <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
  </proxool>
</something-else-entirely>






也可以采用 properties, 在程序 PropertyConfigurator.configure("proxool.properties"); 文件设置

WEB-INF/proxool.properties
jdbc-0.proxool.alias=property-test
jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/test
jdbc-0.proxool.driver-class=org.gjt.mm.mysql.Driver
jdbc-0.user=root
jdbc-0.password=password
jdbc-0.proxool.maximum-connection-count=10
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE






如果在 Web 使用, 在 web.xml 也可以设置 ServletConfigurator Servlet 来注册

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app 
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"/WEB-INF/dtds/web-app_2_3.dtd">
<web-app>
	<display-name>proxool</display-name>

	<servlet>
	  <servlet-name>ServletConfigurator</servlet-name>
	  <servlet-class>
	  org.logicalcobwebs.proxool.configuration.ServletConfigurator
	  </servlet-class>
	 
	  <init-param>
		<param-name>xmlFile</param-name>
		<param-value>WEB-INF/proxool.xml</param-value>
	  </init-param>

	   <load-on-startup>1</load-on-startup>

	</servlet> 


	<servlet>
	  <servlet-name>Admin</servlet-name>
	  <servlet-class>
	  org.logicalcobwebs.proxool.admin.servlet.AdminServlet
	  </servlet-class>
	</servlet>

	<servlet-mapping>
	  <servlet-name>Admin</servlet-name>
	  <url-pattern>/admin</url-pattern>
	</servlet-mapping> 

</web-app>

在程序中, 只需要利用到别名就可以呼叫 connection pool 里面的 connection 来使用了

<%@page import="java.sql.*;"%>
<%
Connection connection = null;
try {
	Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
	connection = DriverManager.getConnection("proxool.xml-test");

} catch (Exception e) {
	out.println(e);
}

out.println("ok");
%>



SECTION 06 使用 connection.close() 关闭 connection

以上的范例我都没有写 close, 希望大家在 connection 做完之后记得使用 close() 来关闭, 将 connection 还到 pool , 以免有 java.sql.SQLException: org.logicalcobwebs.proxool.ProxoolException: ConnectionCount is 10. Maximum connection count of 10 cannot be exceeded. 的现象发生.
参考 -- 相关书目或相关文章

  1. Proxool :
    http://proxool.sourceforge.net/
  2. Proxool API:
    http://proxool.sourceforge.net/api-dev/index.html
新闻 -- OpenSource News

阅读全文
0 0

相关文章推荐

img
取 消
img