JDBC数据库连接池C3P0&Druid
1.数据库连接池
数据库连接–执行完毕–释放。
建立连接和释放连接的过程十分浪费系统资源。
因此出现池化技术:准备一些预先的资源,过来就连接预先准备好的。从而减少连接建立和释放的频度,达到节省资源的目的。
其实就是个容器(集合),存放数据库连接的容器
当系统初始化后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
好处:
(1)节约资源
(2)用户访问高效
常用连接数100个
最小连接数:100
最大连接数:115 业务最高承载上限
超过115,需要排队等待
等待超时:100ms
2.实现
标准的接口:DataSource javax.sql包下的
(1)方法:
获取连接:getConnection()
归还连接:Connection.close() 如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接
(2)一般我们不去实现它,由数据库厂商来实现
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供的
使用了这些数据库连接池之后,我们在项目开发中就不需要编写数据库的代码
3.C3P0:数据库连接池技术
jar包下载连接:https://sourceforge.net/projects/c3p0/
步骤:
(1)导入jar包(三个)c3p0-0.9.5.5.jar mchange-commons-java-0.2.19.jar mysql-connector-java-5.1.44.jar
(2)定义配置文件(配置信息主要是填写数据库驱动、数据库名称、数据库用户名、密码等等,一般修改这些信息,其他的按默认的就可以了。)
名称:c3p0.properties 或者 c3p0-config.xml(能自动加载)
路径:直接将文件放在src目录下即可
(3)创建核心对象 数据库连接池对象 ComboPooledDataSource
(4)获取连接 getConnection()
c3p0-config.xml(名称不能改)
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <!-- This is default config! --> <default-config> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1?characterEncoding=utf8</property> <property name="user">root</property> <property name="password">123456</property> <!-- 连接池参数 --> <!-- 初始化申请的连接数量 --> <property name="initialPoolSize">5</property> <!-- 最大的连接数量 --> <property name="maxPoolSize">10</property> <property name="checkoutTimeout">3000</property> </default-config> <!-- This is my config for mysql--> <named-config name="mysql"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property> <property name="user">root</property> <property name="password">123456</property> <!-- 连接池参数 --> <!-- 初始化申请的连接数量 --> <property name="initialPoolSize">5</property> <!-- 最大的连接数量 --> <property name="maxPoolSize">8</property> <property name="checkoutTimeout">1000</property> </named-config> </c3p0-config>
C3P0Demo01.java
package cn.company.datasource.c3p0; import com.mchange.v2.c3p0.ComboPooledDataSource; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; public class C3P0Demo01 { public static void main(String[] args) throws SQLException { // 创建数据库连接池对象 DataSource dataSource = new ComboPooledDataSource(); // 获取连接对象 Connection connection = dataSource.getConnection(); // 打印 System.out.println(connection); } }
结果
4.Druid:数据库连接池实现技术,由阿里巴巴提供
下载druid的jar包地址:https://mvnrepository.com/artifact/com.alibaba/druid
步骤:
(1)导入jar包 druid-1.0.9.jar
(2)定义配置文件:
是properties形式的
可以叫任意名称,可以放在任意目录下(不会自动加载了,需要手动指定文件的路径和名称)
(3)加载配置文件 Properties
(4)获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory
(5)获取连接:getConnection()
druid.properties
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/db1 username=root password=123456 initialSize=5 maxActive=10 maxWait=3000
package cn.company.datasource.druid; import com.alibaba.druid.pool.DruidDataSourceFactory; import java.io.InputStream; import java.sql.Connection; import java.util.Properties; import javax.sql.DataSource; public class DruidDemo { public static void main(String[] args) throws Exception { // 1.导入jar包 // 2.导入配置文件 // 3.加载配置文件 Properties properties = new Properties(); InputStream resourceAsStream = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(resourceAsStream); // 4.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); // 5.获取连接 Connection connection = dataSource.getConnection(); System.out.println(connection); } }
打印结果:
完整实现查询数据库jdbcstudy信息案例:
package cn.company.datasource.druid; import com.alibaba.druid.pool.DruidDataSourceFactory; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties; import javax.sql.DataSource; public class DruidDemo { public static void main(String[] args) throws Exception { // 1.导入jar包 // 2.导入配置文件 // 3.加载配置文件 Properties properties = new Properties(); InputStream resourceAsStream = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(resourceAsStream); // 4.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); Connection connection = null; PreparedStatement preparedStatement = null; ResultSet rs = null; // 5.获取连接 try { connection = dataSource.getConnection(); String sql = "select * from users where `name`=? and `password`=?"; preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, "lisi"); preparedStatement.setString(2, "123456"); rs = preparedStatement.executeQuery(); while (rs.next()) { System.out.println(rs.getObject("name")); System.out.println(rs.getObject("password")); System.out.println(rs.getObject("email")); System.out.println(rs.getObject("birthday")); } } catch (Exception e) { e.printStackTrace(); } finally { connection.close(); } } }
结果:
定义工具类
(1)定义一个类JDBCUtils
(2)提供静态代码块加载配置文件,初始化连接池对象
(3)提供方法
获取连接方法:通过数据库连接池获取连接
释放资源
获取连接池的方法
JDBCUtils
package cn.company.datasource.utils; /** * Druid连接池的工具类 */ import com.alibaba.druid.pool.DruidDataSourceFactory; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import javax.sql.DataSource; public class JDBCUtils { // 定义一个成员变量 DataSource private static DataSource dataSource; static { // 加载配置文件 Properties properties = new Properties(); try { properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); // 获取dataSource dataSource = DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接的方法 */ public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } /** * 释放资源 */ public static void close(Statement statement, Connection connection) throws SQLException { // if (statement != null) { // statement.close(); // } // if (connection != null) { // connection.close(); //归还连接 // } close(null, statement, connection); } public static void close(ResultSet resultSet, Statement statement, Connection connection) throws SQLException { if (resultSet != null) { resultSet.close(); } if (statement != null) { statement.close(); } if (connection != null) { connection.close(); // 归还连接 } } // 获取连接池的方法 public static DataSource getDataSource() { return dataSource; } }
使用新的工具类JDBCUtils
package cn.company.datasource.druid; import cn.company.datasource.utils.JDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; /** * 使用新的工具类JDBCUtils */ public class DruidDemo2 { public static void main(String[] args) throws SQLException { /** * 完成添加操作 */ Connection connection = null; PreparedStatement preparedStatement = null; try { // 获取连接 connection = JDBCUtils.getConnection(); String sql = "insert into users values(?,?,?,?,?)"; preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, 4); preparedStatement.setString(2, "zhangsan"); preparedStatement.setString(3, "123456"); preparedStatement.setString(4, "2435579944@qq.com"); preparedStatement.setString(5, "2020-12-04"); int i = preparedStatement.executeUpdate(); if (i > 0) { System.out.println("增加成功!"); } } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.close(preparedStatement, connection); } } }