一,概述
平常操作数据库时,都是用户想数据库请求获得连接,而数据库创建连接通常需要消耗相对比较大的资源,创建时间也比较长.如果一个网站每天有上百万的访问量,那么数据库服务器就需要创建上百万次的连接.这对数据库资源是极大的浪费,容易造成服务器内存溢出 宕机等.所以呢,就有了连接池技术.连接池技术的核心思想(这段话来自百度):连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。开源的DBCP和C3P0两种连接池组件就是本文的重点了.
二,DBCP连接池组件
1)SUN公司约定,如果是连接池技术,那么必须实现javax.sql.DataSource接口!
2)DBCP是Apache组织的开源连接池技术实现.使用DBCP数据源,应用程序需要引入两个jar文件,一是commons-dbcp-1.4.jar,另一个就是commons-pool-1.5.6.jar,后面的数字是版本号.可去官网下载相应的组件.
3)Tomcat的连接池就是通过DBCP连接池来实现的.该数据库连接池既可以与应用服务器整合使用,也可以与应用程序独立使用.
4)DBCP核心类:BasicDataSource.
5)代码实现
a,硬编码方式
// 1,硬编码方式实现连接池
@Test
public void testDbcp() throws Exception {
private Connection conn = null;
// DBCP连接池核心类
BasicDataSource dataSource = new BasicDataSource();
// 连接池参数配置:连接字符串 驱动 用户名 密码 初始化连接数 最大连接数
dataSource.setUrl("jdbc:mysql://localhost:3306/day15");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("abc");
dataSource.setInitialSize(3);//初始化连接池大小,有三个连接
dataSource.setMaxActive(6); //最大连接池大小
dataSource.setMaxIdle(3000);// 最大空闲时间3秒
// 获得连接
conn = dataSource.getConnection();
//conn.prepareStatement("delete from dept where id=15").executeUpdate();
for(int i=0;i<23;i++){
String value ="Lucy"+i;
String sql="insert into dept(deptName) values(?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setObject(1, value);
pstmt.executeUpdate();
}
// 关闭资源
conn.close();
}
通过DBCP核心类设置配置参数从而获得数据库连接.
b,通过配置文件方式实现连接池,可扩展性强,易于维护
/**
* 2,配置方式实现连接池
* 推荐使用,便于维护
* 配置文件中的key要与BasicDataSource中的属性一样
* @throws Exception
*/
@Test
public void testProp() throws Exception {
private Connection conn = null;
// 加载Properties配置文件Properties prop = new Properties();// 获取输入流InputStream in = App_DBCP.class.getResourceAsStream("db.properties");// 加载属性配置文件prop.load(in);// 通过配置参数,直接创建数据源DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);// 获得连接conn = dataSource.getConnection();conn.prepareStatement("delete from dept where id=14").executeUpdate();// 关闭资源conn.close();}
db.properites文件内容如下(该文件与上面的代码所在的Java文件在同一个包下):
url=jdbc:mysql://localhost:3306/day15
driverClassName=com.mysql.jdbc.Driver
username=root
password=abc
initialSize=3
maxActive=6
maxIdle=3000
三,C3P0连接池组件
1)C3P0连接池是最常用的连接池技术!Spring框架默认支持C3P0连接池技术.
2)C3P0核心类:CombopooledDataSource
3)引入相应的jar包:c3p0-0.9.1.2.jar,下载相应的组件,导入jar包.
4)代码实现
a,硬编码方式
/**
* 1,硬编码方式:使用c3p0连接池管理连接
*
* @throws Exception
*/
@Test
public void testC3p0() throws Exception {
// 创建连接池核心工具类
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 设置参数:url 驱动 用户名 密码 初始连接数 最大连接数 空闲时间
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/day15");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setUser("root");
dataSource.setPassword("abc");
dataSource.setInitialPoolSize(3);
dataSource.setMaxPoolSize(6);
dataSource.setMaxIdleTime(2000);// 两秒
// 获得连接
Connection conn = dataSource.getConnection();
//执行sql语句
conn.prepareStatement("delete from dept where id=13").executeUpdate();
// 关闭资源
conn.close();
}
和DBCP连接池的方式是不是很像啊?每错,就是很像...
b,配置参数方式(这就有点不一样了)
/**
* 2,XML配置方式方式:使用c3p0连接池管理连接
*
* @throws Exception
*/
@Test
public void testXml() throws Exception {
// 创建连接池核心工具类
// 自动加载src下c3p0的配置文件[c3p0-config.xml],这个文件可以去源码里拷贝模仿
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 传入参数,使用命名的配置:加载c3p0-config.xml里oracle_config里面的配置文件,不传参数就是默认的<default-config>的配置信息
// ComboPooledDataSource dataSource = new ComboPooledDataSource(
// "oracle_config");
// 获得连接
Connection conn = dataSource.getConnection();
conn.prepareStatement("delete from dept where id=12").executeUpdate();
// 关闭资源
conn.close();
}
c3p0-config.xml:
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day15</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">abc</property>
<property name="initialPoolSize">3</property>
<property name="maxPoolSize">6</property>
<property name="maxIdleTime">2000</property>
<!--
<user-overrides user="swaldman">
<property name="debugUnreturnedConnectionStackTraces">true</property>
</user-overrides>
-->
</default-config>
<!--
<named-config name="oracle_config">
<property name="maxStatements">200</property>
<property name="jdbcUrl">jdbc:test</property>
<user-overrides user="poop">
<property name="maxStatements">300</property>
</user-overrides>
</named-config>
-->
</c3p0-config>
这个配置文件可参考c3p0组件的源码里面的配置文件写法.
四,总结
好了,以上就是两种连接池得用法了.下一篇实战,C3P0+DbUtils实现一个JdbcUtils工具类,