数据库连接池总结篇---proxool.jar

1.proxool.jar文件可以在 http://sourceforge.net/projects/proxool/下载得到。
2. 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
URLjdbc:mysql://localhost:3306/test
Driverorg.gjt.mm.mysql.Driver
Connections0 (min), 15 (max)
Prototypingoff
Connection Lifetime11:00:00
Maximum active time07:05:00
House keeping sleep time30s
House keeping test SQLoff
Fatal SQL exceptionsoff
Statisticsoff

Snapshot at 21:12:53
Start date01-??-2003 21:12:30
Connections1 (active), 0 (available), 15 (max)
  
Served1
Refused0
Details
#bornlast
start
lap
(ms)
 thread
1 21:12:31 21:12:3122432   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. 的现象发生.

3.
<script language=javascript> function toggle(id) { var oldAttachmentVersionsBlock = document.getElementById('attachment' + id); with (oldAttachmentVersionsBlock.style) { if ( display == "none" ) display = "" else display = "none" } var arrowIcon = document.getElementById('arrow' + id); with (arrowIcon) { if (src != null && (src.indexOf('/confluence/images/icons/arrow_closed_active_16.gif') != -1 || src.indexOf('/confluence/images/icons/arrow_closing_active_16.gif') != -1)) { src = '/confluence/images/icons/arrow_opening_active_16.gif'; } else { src = '/confluence/images/icons/arrow_closing_active_16.gif'; } } } </script>
 Proxool 提供許多方式可以設定相關的參數,這邊先介紹三種,另外還可以直接在Web應用程式中進行設定的方法,這在下一個主題中再說明。
 可以直接在Java程式中使用java.util.Properties設定,例如:
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
Properties info = new Properties();
info.setProperty("proxool.maximum-connection-count", "20");
info.setProperty("proxool.house-keeping-test-sql", "select CURRENT_DATE");
info.setProperty("user", "caterpillar");
info.setProperty("password", "123456");
Connection conn = DriverManager.getConnection(
"proxool.example:com.mysql.jdbc.Driver:jdbc:mysql://localhost:3306/GUESTBOOK", info);

 當然這種方式是硬編碼(hard code)在程式中,要改變參數時必須修改原始檔案並重新編譯,我們也可以使用XML檔案或屬性檔來進行設定,使用XML檔案的方式如下:
proxool.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<something-else-entirely>
  <proxool>
    <alias>example</alias>
    <driver-url>jdbc:mysql://localhost:3306/GUESTBOOK</driver-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <driver-properties>
      <property name="user" value="caterpillar"/>
      <property name="password" value="123456"/>
    </driver-properties>
    <maximum-connection-count>10</maximum-connection-count>
    <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
  </proxool>
</something-else-entirely>

 其中example是連接池的別名(Alias),我們使用org.logicalcobwebs.proxool.configuration.JAXPConfigurator來讀取XML,以下的示範如何取得連線:
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
JAXPConfigurator.configure("proxool.xml", false); // false 表示不驗證 XML
Connection conn = DriverManager.getConnection("proxool.example");

 我們也可以使用屬性檔來配置Proxool,屬性檔的內容如下:
proxool.properties
jdbc-0.proxool.alias=example
jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/GUESTBOOK
jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver
jdbc-0.user=caterpillar
jdbc-0.password=123456
jdbc-0.proxool.maximum-connection-count=10
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE

 我們使用org.logicalcobwebs.proxool.configuration.PropertyConfigurator來讀取屬性檔,下面示範如何取得連線:
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
org.logicalcobwebs.proxool.configuration.PropertyConfigurator.configure("proxool.properties");
Connection conn = DriverManager.getConnection("proxool.example");

 
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值