1、数据库连接池
数据库连接是一种关键的、有限的资源,这一点在多用户的网页应用程序中体现得尤为突出。频繁的建立和销毁连接会造成资源的浪费。因此出现数据库连接池。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
2、数据库连接池原理
数据库连接池其实和线程池有着相似的原理,都是节约资料,减小我们频繁的建立和断开连接,从而减小开销。
有了数据库连接池,每次创建连接都从连接池中取出,不用的时候再放回连接池。
1、连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。
2、使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。
3、还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
在java中实现数据库连接池
1、实现DataSource接口,在构造函数中批量创建数据库的连接,并把这些连接保存到集合中
2、实现getConnection方法,每一次调用连接从getConnection中获取,返回集合中的一个连接给用户。
3、关闭连接的时候,把连接返回到连接池的集合中。
3、dbcp连接池使用
1、导包
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
2、properties配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/dbcp.properties"));
3、调用连接池中的连接
DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);
示例代码
//dbcp连接池使用
@Test
public void Test2() throws Exception {
//1、导包
// 2、获得加载配置文件的Prop
Properties prop = new Properties();
prop.load(new FileInputStream("src/db.properties"));
// 3、连接池
DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);
Connection conn = dataSource.getConnection();
Statement st = conn.createStatement();
String sql = "select * from t_user ";
ResultSet rs = st.executeQuery(sql);
while (rs.next()){
String name=rs.getString("name");
String password =rs.getString("password");
System.out.println("name----"+name+" password------"+password);
}
rs.close();
st.close();
conn.close();
}
4、c3p0连接池使用
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等
示例:
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///student</property>
<property name="user">root</property>
<property name="password">1234</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</default-config>
<named-config name="oracle">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///student</property>
<property name="user">root</property>
<property name="password">1234</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</named-config>
</c3p0-config>
java代码
@Test
public void test1() throws SQLException {
//1、导包
//2、获取连接池
ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql");
Connection conn = dataSource.getConnection();
String sql = "select * from t_student;";
Statement st = conn.createStatement();
ResultSet re = st.executeQuery(sql);
while (re.next()) {
String name = re.getString("name");
String cl = re.getString("class");
System.out.println("name---" + name + "pass---" + cl);
}
re.close();
st.close();
conn.close();
}
5、c3p0、dbcp比较
现在常用的开源数据连接池主要有c3p0、dbcp和proxool三种,其中:
hibernate开发组推荐使用c3p0;
spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect,告诉连接被重置,这个设置可以解决);
hibernate in action推荐使用c3p0和proxool;