【Java】JDBC Part5 DataSource 连接池操作

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);
    }
}

测试结果

【Java】JDBC Part5 DataSource 连接池操作

 

第二种 XML配置文件

【Java】JDBC Part5 DataSource 连接池操作

 

配置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>

 

注意获取配置名

【Java】JDBC Part5 DataSource 连接池操作

 

如果密码错误,其他配置问题,连接池运行一段时间获取不到连接自动超时退出,报异常

 


 

 

封装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不可封装为实体类对象,所以大文件的字段我删除了

【Java】JDBC Part5 DataSource 连接池操作

 

上一篇:JDBC


下一篇:JAVA访问数据库工具