c3p0连接池的基础使用

连接池含义、作用和工作过程:

最大维持连接数:没有任何请求时在连接池中可以存在的连接数

最大连接数:连接池中最多可以存在的连接个数。

最大等待时间:当断开连接时,超过最大维持连接数的连接不会马上销毁,最大等待时间过后它才会销毁。

连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。

现在假设:最大维持连接数是10,最大连接数是20,最大等待时间是10000(毫秒)其过程:最开始在连接池中有10个连接(最大连接数),当有用户申请连接时,其将一个连接分配用户,直到连接池中的10个连接全都分配出去,当第11个用户申请连接时,它将创建第11个连接并分配给该用户,直到把第20个连接(最大连接数)分配给第20个用户,当第21个用户申请连接时,它需要等待,直到前面的20个用户中某一个断开了连接,才会把那个连接分配给第21个用户,当用户断开连接时(第11至20个连接),该连接不会立刻被释放而是需要等待10000毫秒(最大等待时间),才被释放,当没有用户连接时,连接池内还保持10个连接。

在开发中,使用连接池时若没有关闭连接(调用连接的close方法)会出现“连接池疲劳的错误”。

C3P0是一个开放源代码的JDBC连接池,它在lib目录中与hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。可以到主页下载安装包(主页:http://sourceforge.net/projects/c3p0/

一:导入安装包 commons-logging-1.1.3.jar和 mchange-commons-java-0.2.11.jar和mysql驱动包 mysql-connector-java-5.1.7-bin.jar

二:新建并配置properties文件:c3p0.properties

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=root
minPoolSize=3
maxPoolSize=10

三:建立工具类加载属性文件

package com.test.lianjiechi;

import java.beans.PropertyVetoException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import com.mchange.v2.c3p0.ComboPooledDataSource;



public class DbpoolUtil {
private static Properties p;
private static DbpoolUtil db;
    //初始化时加载属性文件
    static {
        InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("c3p0.properties");
        p=new Properties();
      
            try {
                p.load(is);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
         
    }
    //判断是否为空
    public static DbpoolUtil getDButil(){
        if(db==null){
            db=new DbpoolUtil();
        }
        return db;
    }
    /**
     * 获取连接池
     * @return
     */
    public static ComboPooledDataSource getcomboPooledDataSource(){
        ComboPooledDataSource cpds = new ComboPooledDataSource(); 
        try {
            //属性文件中配置多少属性这边与其对应,名字保证一样
            cpds.setDriverClass(p.getProperty("driverClass")); 
            cpds.setJdbcUrl(p.getProperty("url"));
            cpds.setUser(p.getProperty("user"));
            cpds.setPassword(p.getProperty("password"));
            cpds.setMinPoolSize(Integer.parseInt(p.getProperty("minPoolSize")));
            cpds.setMaxPoolSize(Integer.parseInt(p.getProperty("maxPoolSize")));
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        } 
        return cpds;
    } 
}

四。测试连接数据库并获取数据库信息

package com.test.lianjiechi;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;



public class test {
public static void main(String[] args) {
    DbpoolUtil db=DbpoolUtil.getDButil();
    DataSource d=db.getcomboPooledDataSource();
    try {
        Connection con=d.getConnection();
        Statement st=con.createStatement();
        ResultSet rs=st.executeQuery("select * from t_user");
        while(rs.next()){
            System.out.println(rs.getString("name"));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
}

 

 

posted @ 2017-04-26 13:53  池世武  阅读(130)  评论(0)    收藏  举报