数据库连接池
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。
当一个连接通道使用完后,系统并不会将其释放,而是将它存储在连接池里。下次需要使用连接通道的时候,系统会判断连接池里是否有空闲的连接通道对象。如果有,设置其连接字符串,修改其连接状态,重新使用。
而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
调用close()方法并不是真正关闭连接,而是将连接返回给连接池,避免重复创建,提升性能
C3P0:是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate 一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。目前使用它的开源项目有Hibernate,Spring等。
c3p0默认自动回收空闲连接功能。
加入C3P0连接池:
1.配置文件:必须在src下导入c3p0-config.xml 这个文件(规范)
2.导入相关jar包:先在项目中创建一个lib文件夹,再将下面两个jar包导入,再选中这两个jar包,单击右键,选择Build path的Add to Build patrh
(1)c3p0-0.9.2-pre1.jar
(2)mchange-commons-0.2.jar
注意:导入包时,两个包的版本也是需要匹配的
不然会报错:Exception in thread “main” java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
3、在类目录下加入C3P0的配置文件:c3p0-config.xml,即在项目根目录下读取文件
注意:配置文件中有两种内容相似的配置,一种缺省配置,意思是在没有指定配置文件名时,调用该配置,一种命名配置,也就是在使用配置文件时,加上配置名即可引用,如接下来会说的:new ComboPooledDataSource(“MySQL”);
如下图为缺省配置
命名配置
jdbcUtils_C3P0:
与上一篇的JDBC连接相比明显可以看到代码量少了很多
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import com.hpe.bean.Stu;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Test1 {
public static void main(String[] args) throws Exception {
// 创建连接池,ComboPooledDataSource()对象就可以获得数据源
ComboPooledDataSource ds = new ComboPooledDataSource();
//获取连接
Connection conn = ds.getConnection();
//准备SQL语句
String sql = "select * from stu where age>?";
//运用PreparedStatement工具,发送SQL语句
PreparedStatement pstmt=conn.prepareStatement(sql);
//设置SQL语句的参数
pstmt.setInt(1, 15);
//executeQuery()返回的是一个结果集
ResultSet rst = pstmt.executeQuery();
//处理结果---保存多条数据的集合 在控制台打印查询到的结果
//当调用new ArrayList<>()时,将一个空数组{}赋值给了elementData,这个时候集合的长度size为默认长度0
ArrayList<Stu> stus=new ArrayList<Stu>();
while(rst.next()){
//处理每一行的内容---处理每一列的内容
int sid = rst.getInt("sid");
String sname = rst.getString("sname");
int age = rst.getInt("age");
String gander = rst.getString("gander");
String province = rst.getString("province");
int tuition = rst.getInt("tuition");
//rst--->ArrayList
//将每一列信息封装到实体类中
Stu stu = new Stu();
stu.setSid(sid);
stu.setSname(sname);
stu.setAge(age);
stu.setGander(gander);
stu.setProvince(province);
stu.setTuition(tuition);
stus.add(stu);
System.out.println(stu);
}
//关闭连接
rst.close();
pstmt.close();
conn.close();
}
}