jdbc连接池&改进dbUtil成C3P0Util

时间:2021-08-24 22:57:08

一.jdbc连接池

    1.连接池的存在理由

          前面介绍的dbUtils工具类虽然实现了一个对jdbc的简单封装。但它依旧采取从驱动管理获取连接

         (DriverManager.getConnection(dbUrl, dbUserName, dbPassword)),释放连接的操作。非常消耗系统的资源!

         可以设计一个连接池,来获取con或者存放con

           jdbc连接池&改进dbUtil成C3P0Util

           而归还连接的方式不是直接close(),而是返回到连接池

        

     2.自定义一个连接池

        1.sun公司提供了一个连接池的接口(java.sql.dataSourse)

        2.自定义一个连接池,实现该接口

        3.定义一个List集合存放多个连接,从集合中存取(考虑到频繁的存取,用LinkList)

       

public class MyDataSource implements DataSource{
//1.创建1个容器用于存储Connection对象
private static LinkedList<Connection> pool = new LinkedList<Connection>(); //2.创建5个连接放到容器中去
static{
for (int i = ; i < ; i++) {
Connection conn = DbUtil.getConnection();
pool.add(conn);
}
} /**
* 重写获取连接的方法
*/
@Override
public Connection getConnection() throws SQLException {
Connection conn = null;
//3.使用前先判断
if(pool.size()==){
//4.池子里面没有,我们再创建一些
for (int i = ; i < ; i++) {
conn = dbUtil.getConnection();
pool.add(conn);
}
}
//5.从池子里面获取一个连接对象Connection
conn = pool.remove();
return conn;
} /**
* 归还连接对象到连接池中去
*/
public void backConnection(Connection conn){
pool.add(conn);
}

     3.常见的开源数据库连接池(C3PO和DBCP,以C3P0为例)

          1.导入C3P0连接池所依赖的jar包

        jdbc连接池&改进dbUtil成C3P0Util

       2.编写C3PO的配置文件

        

        

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config> <default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///db_</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize"></property>
<property name="maxPoolSize"></property>
</default-config> <named-config name="my">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///db_</property>
<property name="user">root</property>
<property name="password">root</property>
</named-config> </c3p0-config>

     3.实现C3P0Util工具类

      

public class C3P0Utils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("my"); public static DataSource getDataSource() {
return dataSource;
} public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}