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

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

你可能感兴趣的:(数据库连接池,J2EE)