数据库连接池
概念:存放数据库连接的容器
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
c3p0
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
拷贝jar文件 c3p0-0.9.1.2.jar
不使用配置文件方式
Connection conn = null;
PreparedStatement ps = null;
try {
//1. 创建datasource
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//2. 设置连接数据的信息
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");
dataSource.setUser("root");
dataSource.setPassword("root");
//2. 得到连接对象
conn = dataSource.getConnection();
String sql = "insert into account values(null , ? , ?)";
ps = conn.prepareStatement(sql);
ps.setString(1, "admi234n");
ps.setInt(2, 103200);
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, ps);
}
使用配置文件方式
c3p0的配置文件 支持 properties , 也支持 xml 方式。 不过开发中,一般使用xml方式来配置
src下, 创建xml文件,名为:c3p0-config.xml 注意此处,名字需要固定。
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore
</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 初始化连接池数量 -->
<property name="initialPoolSize">10</property>
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">60</property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">25</property>
<!--连接池中保留的 最小连接数.Default: 3 -->
<property name="minPoolSize">10</property>
</default-config>
</c3p0-config>
使用c3p0的JDBCUtil类
public class JdbcDemo5 {
public static void main(String[] args) {
List<Emp> list=new JdbcDemo5().findAll();
System.out.println(list);
}
public List<Emp> findAll() {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
List<Emp> list=null;
try {
/* //注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取数据库的连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1?serverTimezone=GMT%2B8\n", "root", "root");
*/
conn=JDBCUtils.getConnection();
//定义sql语句
String sql = "select*from stu";
//获取执行mysql的对象Statement
stat = conn.createStatement();
//执行sql
rs = stat.executeQuery(sql);
//遍历结果集,封装对象,装载集合
Emp emp=null;
list=new ArrayList<>();
//处理结果,获取数据
while (rs.next()) {
//让游标向下移动一行
int id = rs.getInt(1);
String name = rs.getString("name");
double math = rs.getDouble("math");
double english=rs.getDouble("english");
//创建emp对象
emp=new Emp();
emp.setId(id);
emp.setName(name);
emp.setMath(math);
emp.setEnglish(english);
list.add(emp);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs,stat,conn );
}
return null;
}
}