一.jdbc连接池
1.连接池的存在理由
前面介绍的dbUtils工具类虽然实现了一个对jdbc的简单封装。但它依旧采取从驱动管理获取连接
(DriverManager.getConnection(dbUrl, dbUserName, dbPassword)),释放连接的操作。非常消耗系统的资源!
可以设计一个连接池,来获取con或者存放con
而归还连接的方式不是直接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 = 0; i < 5; i++) { Connection conn = DbUtil.getConnection(); pool.add(conn); } } /** * 重写获取连接的方法 */ @Override public Connection getConnection() throws SQLException { Connection conn = null; //3.使用前先判断 if(pool.size()==0){ //4.池子里面没有,我们再创建一些 for (int i = 0; i < 5; i++) { conn = dbUtil.getConnection(); pool.add(conn); } } //5.从池子里面获取一个连接对象Connection conn = pool.remove(0); return conn; } /** * 归还连接对象到连接池中去 */ public void backConnection(Connection conn){ pool.add(conn); }
3.常见的开源数据库连接池(C3PO和DBCP,以C3P0为例)
1.导入C3P0连接池所依赖的jar包
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">5</property> <property name="maxPoolSize">20</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); } } }