前言
Proxool也是目前主流的数据库连接池,Proxool是一种Java数据库连接池技术。也是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。下面是对Proxool连接池的一些技术小结
使用Proxool连接池方式
在官方提供的文档中,有多种使用Proxool的方式,这里只介绍两种:一种是通过配置文件的方式使用Proxool;一种是通过直接设置属性的方式使用。其中使用了Proxool连接池中的数据源。与jdbc pool一样也是通过数据源的方式进行配置
1、直接设置属性的方式
编写一个工具类,该类可以返回Proxool数据库连接对象
package cp;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.logicalcobwebs.proxool.ProxoolDataSource;
import org.logicalcobwebs.proxool.ProxoolException;
import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;
public class Proxool {
private ProxoolDataSource dataSource = null;
public Proxool() {
dataSource = new ProxoolDataSource();
init2();
}
public void init2(){
dataSource = new ProxoolDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setDriverUrl("jdbc:mysql://localhost/test");
dataSource.setUser("root");
dataSource.setPassword("1234");
dataSource.setAlias("mysql");
dataSource.setMaximumConnectionCount(5);
dataSource.setMinimumConnectionCount(0);
dataSource.setMaximumActiveTime(5);
}
public Connection getProxoolConnection2() {
Connection connection = null;
try {
connection = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
然后编写测试代码:
public class TestCp {
public static void main(String[] args) throws SQLException {
Proxool p = new Proxool();
for (int i = 0; i < 5; i++) {
Connection con = p.getProxoolConnection2();
System.out.println(con);
}
}
}
测试结果如下:
可以发现,返回的是不同的五个连接对象。使用这种方式的好处简单直接,缺点是不易维护,属性发生变化需要修改代码。
2、使用配置文件
下面,我们看看如何以配置文件的方式使用Proxool连接池。首先,自然,需要创建一个proxool.xml配置文件,暂且先放到src根目录下。文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
<proxool>
<alias>mysql</alias>
<!--数据源的别名 -->
<driver-url>jdbc:mysql://127.0.0.1/test</driver-url>
<!--url-->
<driver-class>com.mysql.jdbc.Driver</driver-class>
<!--驱动类 -->
<driver-properties>
<property name="user" value="root" />
<property name="password" value="1234" />
</driver-properties>
<!-- 任一时刻,可以(同时)建立的最大连接数 -->
<simultaneous-build-throttle>10</simultaneous-build-throttle>
<!--最大连接数(默认5个)-->
<maximum-connection-count>100</maximum-connection-count>
<!--最小连接数(默认2个) -->
<minimum-connection-count>10</minimum-connection-count>
<!--proxool自动侦察各个连接状态的时间间隔(毫秒)-->
<house-keeping-sleep-time>120000</house-keeping-sleep-time>
<!--最少保持的空闲连接数 -->
<prototype-count>10</prototype-count>
<!--在使用之前测试 -->
<test-before-use>true</test-before-use>
<!--用于保持连接的测试语句 -->
<house-keeping-test-sql>select 1</house-keeping-test-sql>
</proxool>
</something-else-entirely>
上面的这些属性也可以通过第一种方式进行设置,之后,需要编写获取连接的方法,代码如下:
public class Proxool {
public Proxool() {
dataSource = new ProxoolDataSource();
init();
}
public void init() {
InputStream in = Proxool.class.getResourceAsStream("/proxool.xml");
Reader reader = null;
try {
reader = new InputStreamReader(in, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
JAXPConfigurator.configure(reader, false);
} catch (ProxoolException e) {
e.printStackTrace();
}
}
public Connection getProxoolConnection() {
Connection connection = null;
try {
connection = DriverManager.getConnection("proxool.mysql");
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
注意两者的区别,使用这种方式需要读取proxool.xml这个配置文件(以流的方式),读取之后,调用JAXPConfigurator的configure方法就可以完成对xml文件的解析了。之后在客户端直接调用getConnection方法就能从数据库连接池中获取连接了。测试代码如下:
public class TestCp {
public static void main(String[] args) throws SQLException {
Proxool p = new Proxool();
for (int i = 0; i < 5; i++) {
Connection con = p.getProxoolConnection();
System.out.println(con);
}
}
}
测试如下:
Proxool数据库连接池小结
使用Proxool数据库连接池可以很好管理数据库连接,提高服务器的响应性能。总结jdbc pool数据库连接池与Proxool数据库连接池,可以发现两者存在一定的共性:都是通过数据源的方式获取连接,这点与普通jdbc操作有很大不同,Drivermanager类使用后不能及时释放资源,而且是不可重用的。而数据库连接池则管理了数据库连接池任何一个连接对象,包括其创建、释放和销毁。
Proxool上述的两种方式都比较普遍,但是使用配置文件灵活性比较大,便于对代码进行维护,推荐这种使用方式。