JDBC Part5 DataSource 连接池操作
- javax.sql.DataSource 接口,通常由服务器实现
- DBCP Tomcat自带相对C3P0速度较快,但存在BUG,已经不更新了
- Proxool 没听过、能监控连接池状态,稳定性差
- C3P0 速度较慢,但是稳定
- Druid 阿里巴巴提供,集成上面的所有优点,
- Hikari 目前最快的连接池依赖,据说有安全问题。。。
DataSource被称为数据源,包含连接池和连接池管理2部分
C3P0实现
官方文档: https://blog.csdn.net/wangwei_cq/article/details/8930667
Maven依赖
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency>
第一种,硬编码的连接池
package connector; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.junit.Test; import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.SQLException; /** * @author ArkD42 * @file Jdbc * @create 2020 - 04 - 24 - 17:49 */ public class C3P0Test { @Test public void dataSourceByC3p0() throws PropertyVetoException, SQLException { // 获取池对象 ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 配置连接信息 dataSource.setDriverClass("com.mysql.cj.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc_db?serverTimezone=Asia/Shanghai"); dataSource.setUser("root"); dataSource.setPassword("123456"); //设置初始的连接数 dataSource.setInitialPoolSize(10); //获取连接 Connection connection = dataSource.getConnection(); System.out.println(connection); } }
测试结果
第二种 XML配置文件
配置XML配置文件的信息
<?xml version="1.0" encoding="UTF-8" ?> <c3p0-config> <!-- 自定义的配置命名--> <named-config name="c3p0 XML config"> <!-- 四个基本信息 --> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <!-- 默认本地可以省略 jdbc:mysql:///jdbc_db?serverTimezone=Asia/Shanghai --> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_db?serverTimezone=Asia/Shanghai</property> <property name="user">root</property> <property name="password">123456</property> <!-- 连接池管理信息 --> <!-- 连接对象数不够时,每次申请 迭增的连接数 --> <property name="acquireIncrement">5</property> <!-- 初始池大小存放的连接对象数 --> <property name="initialPoolSize">10</property> <!-- 最小连接对象数 --> <property name="minPoolSize">10</property> <!-- 最大连接对象数,不可超出的范围 --> <property name="maxPoolSize">100</property> <!-- 最多维护的SQL编译对象个数--> <property name="maxStatements">50</property> <!-- 每个连接对象最多可使用的SQL编译对象的个数 --> <property name="maxStatementsPerConnection">2</property> </named-config> </c3p0-config>
注意获取配置名
如果密码错误,其他配置问题,连接池运行一段时间获取不到连接自动超时退出,报异常
封装JdbcForC3P0Util工具类
import java.sql.*; import java.util.ArrayList; import java.util.List; /** * @author ArkD42 * @file Jdbc * @create 2020 - 04 - 24 - 18:23 */ public class JdbcForC3p0Util { // 池对象只需要一个即可 private static final ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("c3p0 XML config"); // 获取连接对象,从池对象获取的对象可允许多个 public static Connection getConnection(){ try { return comboPooledDataSource.getConnection(); } catch (SQLException sqlException) { sqlException.printStackTrace(); } return null; } // 释放资源 对象没有的情况直接null注入 public static void releaseResource(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){ try{ if (resultSet != null) resultSet.close(); if (preparedStatement != null) preparedStatement.close(); if (connection != null) connection.close(); } catch (SQLException sqlException){ sqlException.printStackTrace(); } } // 增删改 public static int update(String sql,Object[] args) { Connection connection = null; PreparedStatement preparedStatement = null; try { connection = getConnection(); preparedStatement = connection.prepareStatement(sql); if (args != null ) for (int i = 0; i < args.length; i++) preparedStatement.setObject(i+1,args[i]); int i = preparedStatement.executeUpdate(); return i; } catch (SQLException e) { e.printStackTrace(); } finally { releaseResource(connection,preparedStatement,null); } return 0; } // 查询 public static <T> List<T> queryList(Class<T> tClass, String sql, Object[] args){ Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try{ connection = getConnection(); preparedStatement = connection.prepareStatement(sql); if (args != null) for (int i = 0; i < args.length; i++) preparedStatement.setObject(i+1,args[i]); resultSet = preparedStatement.executeQuery(); ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); List<T> tList = new ArrayList<T>(); while(resultSet.next()){ T t = tClass.newInstance(); for (int i = 0; i < columnCount; i++) { Object columnValue = resultSet.getObject(i + 1); String columnLabel = metaData.getColumnLabel(i + 1); Field field = tClass.getDeclaredField(columnLabel); field.setAccessible( true ); field.set(t,columnValue); } tList.add(t); } return tList; } catch (Exception e){ e.printStackTrace(); } finally { releaseResource(connection,preparedStatement,resultSet); } return null; } }
测试,Blob不可封装为实体类对象,所以大文件的字段我删除了