自定义了一个数据库连接池工具类,此类主要有以下功能:
- 管理C3p0 、DBCP两种类型的数据库连接池;
- 分别把C3p0 、DBCP两个数据库连接池封装到JdbcTemplate包装类中,并返回;
- 可分别从C3p0 、DBCP两个数据库连接池中得到数据库连接对象Connection;
- 可用于在IOC容器中,采了静态工厂的方式,创建C3p0 、DBCP两个数据库连接池的Bean,且都为单例;
一、具体实现代码:
// TODO: 2021/7/10 采取c3p0的数据连接池
private static ComboPooledDataSource dataSource;
// TODO: 2021/7/10 采取DBCP的数据连接池
private static BasicDataSource basicDataSource;
// TODO: 2021/7/11 这两个连接池用于IOC容器中
private static ComboPooledDataSource dataSourceC3p0Ioc = null;
private static BasicDataSource dataSourceDbcpIoc = null;
// TODO: 2021/7/11 创建数据库连接池,使在这个数库连接池在IOC容器中永远是单例,在IOC窗口中采取静态的方法创建了普瑞不能Bean
public static DataSource createC3p0DataSourceIoc(String configName){
if (dataSourceC3p0Ioc == null) {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(configName);
dataSourceC3p0Ioc = comboPooledDataSource;
return comboPooledDataSource;
}else{
return dataSourceC3p0Ioc;
}
}
public static DataSource createDbcpDatasourceIoc(String propertiesName) throws Exception {
if (dataSourceDbcpIoc == null) {
InputStream resourceAsStream = BasicDataSource.class.getClassLoader().getResourceAsStream(propertiesName);
Properties properties = new Properties();
properties.load(resourceAsStream);
BasicDataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
dataSourceDbcpIoc = dataSource;
return dataSource;
}else {
return dataSourceDbcpIoc;
}
}
// TODO: 2021/7/10 静态代码块,在工具类中创一个c3p0数据库连接池,连接配置文件名为:c3p0-config.xml
static {
ComboPooledDataSource jdbcConfig = new ComboPooledDataSource();
dataSource = jdbcConfig;
}
// TODO: 2021/7/10 静态代码块中为采取 DBCP数据库连接池,加载的是属性properties文件,属性文件命名需按照一定的规则
static {
Properties properties = new Properties();
InputStream resourceAsStream = BasicDataSource.class.getClassLoader().getResourceAsStream("dbcp4.properties");
try {
properties.load(resourceAsStream);
BasicDataSource basicData = BasicDataSourceFactory.createDataSource(properties);
basicDataSource = basicData;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
// TODO: 2021/7/10 从c3p0数据库连接池中得到一个连接
public static Connection getConnectionc3p0() throws SQLException {
return dataSource.getConnection();
}
// TODO: 2021/7/10 从dbcp数据库连接池中得到一个连接
public static Connection getConnectionDbcp() throws SQLException {
return basicDataSource.getConnection();
}
// TODO: 2021/7/10 对连接进行关闭
public static void release(Connection conn) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// TODO: 2021/7/11 返回一个c3p0数据库连接池的包装类JdbcTemplate
public static JdbcTemplate getJdbcTemplateC3p0(){
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
// TODO: 2021/7/11 返回一个JdbcTemplate包装类对象,被封装的数据库连接池为DBCP连接池
public static JdbcTemplate getJdbcTemplateDbcp(){
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(basicDataSource);
return jdbcTemplate;
}
二、C3p0数据库连接池配置文件c3po-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- TODO: 此文件必须命名为: c3p0-confing.xml-->
<c3p0-config>
<!-- TODO:此处为给此文件命名为:jdbcConfig,在创建c3p0数据库连接池时,可以通过此名来加载引xml文件 -->
<named-config name="jdbcConfig">
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 当连接数量用尽时,可定期的增量数 -->
<property name="acquireIncrement">10</property>
<!-- 数据库初始化时,需要初始化连接池中连接的数量 -->
<property name="initialPoolSize">100</property>
<!-- 连接池的最小连接数 -->
<property name="minPoolSize">10</property>
<!-- 连接池的最大连接数 -->
<property name="maxPoolSize">200</property>
<!-- 连接池中 Statement 的最大个数 -->
<property name="maxStatements">20</property>
<!-- 连接池中每个连接可以同时使用的 Statement 的个数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
<default-config>
<!-- TODO:这个地方可以写默认的c3p0数据库连接池配置文件 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 当连接数量用尽时,可定期的增量数 -->
<property name="acquireIncrement">10</property>
<!-- 数据库初始化时,需要初始化连接池中连接的数量 -->
<property name="initialPoolSize">100</property>
<!-- 连接池的最小连接数 -->
<property name="minPoolSize">10</property>
<!-- 连接池的最大连接数 -->
<property name="maxPoolSize">200</property>
<!-- 连接池中 Statement 的最大个数 -->
<property name="maxStatements">20</property>
<!-- 连接池中每个连接可以同时使用的 Statement 的个数 -->
<property name="maxStatementsPerConnection">5</property>
</default-config>
</c3p0-config>
三、DBCP数据库连接池properties配置文件
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&useSSL=false
username=root
password=123456
maxTotal:100
initialSize:10
maxWait:60000
minIdle:10
maxIdle:15
logAbandoned:true
removeAbandoned:true
removeAbandonedTimeout:10
timeBetweenEvictionRunsMillis:10000
numTestsPerEvictionRun:10
minEvictableIdleTimeMillis:10000
validationQuery:SELECT 1 FROM DUAL
#\u6821\u9A8C\u94FE\u63A5
testWhileIdle:true
testOnBorrow:true