首页 > 代码库 > c3p0 数据库连接池
c3p0 数据库连接池
C3P0连接池
c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0一般是与Hibernate,Spring等框架一块使用的,当然也可以单独使用。
dbcp没有自动回收空闲连接的功能,c3p0有自动回收空闲连接功能。
使用c3p0需要导入c3p0.jar、mchange-commons-.jar,如果操作的是Oracle数据库,那么还需要导入c3p0-oracle-thin-extras-pre1.jar
这里我使用的是MySQL数据库
这里我要说得有两种方法建立数据库连接池
第一种:通过代码连接数创建数据库连接池
首先准备一组数据库数据
如图
在eclipse ee里面添加相应的驱动包
c3p0.jar、mchange-commons-.jar,还有数据库连接的jar包
首先创建C3p0_first类文件
package com.c3p0.test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3p0_first { // 数据库连接池ComboPooledDataSource private static ComboPooledDataSource ds = null; // 在静态代码块中创建数据库连接池 static { try { // 通过代码创建C3P0数据库连接池 // 创建连接池对象 ds = new ComboPooledDataSource(); // 获取数据库连接 ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl("jdbc:mysql://localhost:3306/test02"); ds.setUser("root"); ds.setPassword("root"); ds.setInitialPoolSize(10);// 初始化的连接数,取值应在为10 ds.setMinPoolSize(5);//连接池中保留的最小连接数 ds.setMaxPoolSize(20);//连接池中保留的最大连接数 } catch (Exception e) { e.printStackTrace(); } } // 从数据源中获取数据库连接的方法 public static Connection getConnection() throws SQLException { // 从数据源中获取数据库连接 return ds.getConnection(); } // 释放链接 public static void release(Connection conn) { if (conn != null) { try { // 将Connection连接对象还给数据库连接池 conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
然后创建Testc3p0类文件
package com.c3p0.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import com.c3p0.enity.Employee; import com.c3p0.jdbcUtils.JdbcUtils_C3P0; public class Testc3p0 { public List<Employee> queryAll(){ String sql = "select * from emp"; Connection conn = null; PreparedStatement st = null; ResultSet rs = null; Employee ee = null; //创建一个集合来接受查询的数据 List<Employee> list=new ArrayList<>(); try { // 获取数据库连接 conn = C3p0_first.getConnection(); st = conn.prepareStatement(sql);// 执行SQL语句 rs = st.executeQuery();// 返回结果 while (rs.next()) { ee = new Employee(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getString(7)); list.add(ee); System.out.println(list); } } catch (Exception e) { e.printStackTrace(); } finally { // 释放资源 JdbcUtils_C3P0.release(conn); } return list; } }
再创建实体类employee类文件
用来存放查询的数据,并且设置想应的set和get,构造方法
package com.c3p0.enity; public class Employee { private String EmpId; private String Empname; private String Pwd; private String LoginDate; private String Adress; private String Jod; private String Email; public Employee() { super(); } public Employee(String empname, String pwd, String loginDate, String adress, String jod, String email) { super(); Empname = empname; Pwd = pwd; LoginDate = loginDate; Adress = adress; Jod = jod; Email = email; } public Employee(String empId, String empname, String pwd, String loginDate, String adress, String jod, String email) { super(); EmpId = empId; Empname = empname; Pwd = pwd; LoginDate = loginDate; Adress = adress; Jod = jod; Email = email; } public String getEmpId() { return EmpId; } public void setEmpId(String empId) { EmpId = empId; } public String getEmpname() { return Empname; } public void setEmpname(String empname) { Empname = empname; } public String getPwd() { return Pwd; } public void setPwd(String pwd) { Pwd = pwd; } public String getLoginDate() { return LoginDate; } public void setLoginDate(String loginDate) { LoginDate = loginDate; } public String getAdress() { return Adress; } public void setAdress(String adress) { Adress = adress; } public String getJod() { return Jod; } public void setJod(String jod) { Jod = jod; } public String getEmail() { return Email; } public void setEmail(String email) { Email = email; } }
最后,创建测试类
package com.c3p0.test; import java.util.List; import com.c3p0.enity.Employee; public class Test { public static void main(String[] args) { Testc3p0 tc=new Testc3p0(); List<Employee> list=tc.queryAll(); for(Employee ee:list){ System.out.println(ee.getEmpname()+"\t"+ee.getAdress()+"\t"+ee.getEmail()+"\t"+ee.getLoginDate()+"\t"); } } }
打印出查询结果
第二种数据库连接池的方法,配置文件,在src目录下面创建c3p0-config.xml的配置文件,文件名必须为这个
<c3p0-config> <!-- C3P0的缺省(默认)配置,--> <!-- 如果在代码中“ComboPooledDataSourceds = new ComboPooledDataSource();”这样写就表示使用的是C3P0的缺省(默认)配置信息来创建数据源 --> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test02</property> <property name="user">root</property> <property name="password">root</property> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default:3 --> <property name="acquireIncrement">5</property> <!--初始化的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3--> <property name="initialPoolSize">10</property> <!--连接池中保留的最小连接数--> <property name="minPoolSize">5</property> <!--连接池中保留的最大连接数。Default:15 --> <property name="maxPoolSize">20</property> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <property name="acquireRetryAttempts">30</property> <!--两次连接中间隔时间,单位毫秒。Default: 1000 --> <property name="acquireRetryDelay">1000</property> <!--连接关闭时默认将所有未提交的操作回滚。Default: false --> <property name="autoCommitOnClose">false</property> </default-config> </c3p0-config>
然后数据库的连接方法与上面一样。只需要把C3p0_first文件里面的连接数据库的内容改一下
把连接部分注释掉
package com.c3p0.test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3p0_first { // 数据库连接池ComboPooledDataSource private static ComboPooledDataSource ds = null; // 在静态代码块中创建数据库连接池 static { try { // 通过代码创建C3P0数据库连接池 // 创建连接池对象 /*ds = new ComboPooledDataSource(); // 获取数据库连接 ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl("jdbc:mysql://localhost:3306/test02"); ds.setUser("root"); ds.setPassword("root"); ds.setInitialPoolSize(10);// 初始化的连接数,取值应在为10 ds.setMinPoolSize(5);//连接池中保留的最小连接数 ds.setMaxPoolSize(20);//连接池中保留的最大连接数*/ ds= new ComboPooledDataSource(); } catch (Exception e) { e.printStackTrace(); } } // 从数据源中获取数据库连接的方法 public static Connection getConnection() throws SQLException { // 从数据源中获取数据库连接 return ds.getConnection(); } // 释放链接 public static void release(Connection conn) { if (conn != null) { try { // 将Connection连接对象还给数据库连接池 conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
测试结果
c3p0 数据库连接池
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。