J2EE开发技术点6:Proxool数据库连接池

来源:互联网 发布:日历设计软件 编辑:程序博客网 时间:2024/06/07 03:46

前言
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上述的两种方式都比较普遍,但是使用配置文件灵活性比较大,便于对代码进行维护,推荐这种使用方式。

0 0