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(); } } }

浙公网安备 33010602011771号