一、数据库连接池的必要性
传统模式:
- 主程序(servlet、beans)中建立数据库连接
- 进行sql操作
- 断开数据库连接
存在问题:
- 数据库的连接资源没有得到很好的重复利用
- 对于每一次数据库链接,使用完后都得断开(否则可能内存泄露)
- 这种开发不能控制被创建的连接对象数。 系统资源会被毫无顾及地分配出去,如果连接过多,也可能导致内存泄露,服务器崩溃。
java中内存泄露? 内存中有对象,没有及时被回收
二、数据库连接池技术
基本思想: 为数据库建立缓冲池。预先在缓冲池中访入一定数量的连接,需要建立连接时,从池中取出一个,使用完后放回。
数据库连接池负责分配、管理和释放数据库连接。
初始化连接池初始化时将创建一定数量的数据连接放到连接池中,数量由最小数据库连接数来设定
优点:
- 资源重用
- 更快的系统反应速度
- 新的资源分配手段
- 统一的连接管理,避免数据库连接泄露
多种开源的数据库连接池DBCP,C3P0,Proxool,BoneCP…现在主要用Druid
三、C3P0数据库连接池的两种实现方式
导入1个jar包到lib下
public class C3P0Test {
@Test
public void testGetConnection() throws PropertyVetoException, SQLException {
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.mysql.jdbc.Driver" );
cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&rewriteBatchStatements=true&serverTimezone=GMT%2B8" );
cpds.setUser("root");
cpds.setPassword("123456");
cpds.setInitialPoolSize(10);
Connection conn=cpds.getConnection();
System.out.println(conn);
}
@Test
public void test2() throws SQLException {
ComboPooledDataSource cpds = new ComboPooledDataSource("helloc3p0");
Connection conn = cpds.getConnection();
System.out.println(conn);
}
}
配置文件的写法
<c3p0-config>
<named-config name="helloc3p0">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&rewriteBatchStatements=true&serverTimezone=GMT</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="acquireIncrement">50</property>
<property name="initialPoolSize">100</property>
<property name="minPoolSize">50</property>
<property name="maxPoolSize">100</property>
<property name="maxStatements">50</property>
<property name="maxStatementsPerConnection">2</property>
</named-config>
</c3p0-config>
四、DBCP数据库连接池的使用
具体过程吞了,这里总结大概流程,如下:
- 导入jar包
- 创建DBCP数据库连接池
- 设置基本信息(或者是写配置文件)
- 获取连接(Connection)
五、Druid(德鲁伊)数据库连接池
public void getConnnection() throws Exception
{
Properties pros=new Properties();
InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);
DataSource source = DruidDataSourceFactory.createDataSource(pros);
Connection conn=source.getConnection();
System.out.println(conn);
}
|