JDBC总结2_数据库连接池
一、概述
基本概念:
- 数据库连接池就是一个容器(集合),存放数据库连接的容器。
- 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
优势:
- 节约资源
- 用户访问高效
实现:
-
标准接口:DataSource
方法:
- 获取连接:getConnection()
- 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接。
-
常使用的数据库连接池
- DBCP:(DataBase Connection Pool)数据库连接池,由Apache开发。
- C3P0:数据库连接池技术。
- Druid:数据库连接池实现技术,由阿里巴巴提供的。
二、常用连接池
2.1 DBCP
-
DBCP是Java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。
-
使用步骤:
- 导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
- 使用api
-
代码演示:
- 采用硬编码的方式(不推荐)
public class DBCPPool1 { public static void main(String[] args) throws SQLException { //创建连接池 BasicDataSource bds = new BasicDataSource(); //配置信息 bds.setDriverClassName("com.mysql.jdbc.Driver"); bds.setUrl("jdbc:mysql://localhost:3306/mydb"); bds.setUsername("root"); bds.setPassword("123"); Connection conn = bds.getConnection(); //定义sql String sql ="insert into user values (null,?,?)"; PreparedStatement ps = conn.prepareStatement(sql); //设置参数 ps.setString(1,"赵敏"); ps.setString(2,"123"); //进行操作 int i = ps.executeUpdate(); if (i>0){ System.out.println("操作成功"); }else { System.out.println("操作失败"); } } }
- 采用配置文件的方式
public class DBCPPool2 { public static void main(String[] args) throws Exception { Properties pro = new Properties(); //加载配置文件 pro.load(new FileInputStream("dbcp.properties")); //创建连接池 DataSource ds = new BasicDataSourceFactory().createDataSource(pro); Connection conn = ds.getConnection(); String sql = "insert into user values (null,?,?)"; PreparedStatement ps = conn.prepareStatement(sql); //设置参数 ps.setString(1,"张无忌"); ps.setString(2,"12345"); //进行操作 int i = ps.executeUpdate(); if (i>0){ System.out.println("操作成功"); }else { System.out.println("操作失败"); } } }
2.2 C3P0
-
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
-
C3P0和DBCP的区别:
- DBCP没有自动回收空闲连接的功能。
- C3P0有自动回收空闲连接功能。
-
使用步骤:
- 1.导入jar包(c3p0-0.9.1.2.jar)
- 使用api
-
代码演示:
- 采用硬编码的方式(不推荐)
public class C3P0Pool { public static void main(String[] args) throws PropertyVetoException, SQLException { //创建连接池 ComboPooledDataSource cpds = new ComboPooledDataSource(); //设置连接参数 cpds.setDriverClass("com.mysql.jdbc.Driver"); cpds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb"); cpds.setUser("root"); cpds.setPassword("123"); Connection conn = cpds.getConnection(); //定义sql String sql = "insert into user values (null,?,?)"; PreparedStatement ps = conn.prepareStatement(sql); //设置参数 ps.setString(1,"周芷若"); ps.setString(2,"99999"); //进行操作 int i = ps.executeUpdate(); if (i>0){ System.out.println("操作成功"); }else { System.out.println("操作失败"); } } }
-
采用配置文件的方式
配置文件设置要求:
- 配置文件的名称:c3p0.properties 或者 c3p0-config.xml
- 配置文件的路径:src目录下
- 本次使用的配置文件:c3p0-config.xml
public class C3P0Pool2 { public static void main(String[] args) throws IOException, SQLException { //如果是空参,就读取 xml配置文件中的默认配置 //ComboPooledDataSource cpds = new ComboPooledDataSource(); //如果传入 xml配置文件中的第二配置名,那就读取第二配置 ComboPooledDataSource cpds = new ComboPooledDataSource("myname"); Connection conn = cpds.getConnection(); String sql = "select * from user where id > ?"; PreparedStatement ps = conn.prepareStatement(sql); //设置参数 ps.setInt(1, 2); ResultSet resultSet = ps.executeQuery(); while (resultSet.next()) { int id = resultSet.getInt(1); String username = resultSet.getString(2); System.out.println(id+"---"+username); } } }
2.3 Druid
-
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池。
-
使用步骤:
- 导入jar包 druid-1.0.9.jar
- 定义配置文件:
- 是properties形式的
- 可以叫任意名称,可以放在任意目录下
- 使用api
-
代码演示:(使用配置文件)
public class DruidPool { public static void main(String[] args) throws Exception { Properties pro = new Properties(); pro.load(new FileInputStream("druid.properties")); DataSource ds = new DruidDataSourceFactory().createDataSource(pro); Connection conn = ds.getConnection(); String sql = "select * from user where id > ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1,0); ResultSet resultSet = ps.executeQuery(); while (resultSet.next()) { int id = resultSet.getInt(1); String username = resultSet.getString(2); System.out.println(id+"---"+username); } } }