前言
数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
一、 DBCP连接池
DBCP是一个依赖Jakartacommons-pool对象池机制的数据库连接池。DBCP可以直接的在应用程序中使用。
使用步骤
1.导入jar包
commons-dbcp-1.4.jar和commons-pool-1.5.6.jar
百度网盘连接:https://pan.baidu.com/s/1HEeYivITWRDRl1935uX6JgDBCP链接jar包 提取码:le29
2.具体实现代码
代码如下:
- 配置文件
dbcpconfig.properties
#连接设置
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/hz?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=root
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=20
#<!-- 超时等待时间单位毫秒 -->
maxWait=60000
connectionProperties=userUnicode=true;characterEncoding=UTF8
defaultAutoCommit=true;
defaultReadOnly=
defaultTransactionIsolation=Read_UNCOMMITTED
- 实现类
DbConnection_DBCP.java
package dao.common;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Date;
import java.util.Properties;
public class DbConnection_DBCP {
private static DataSource dataSource = null;
static {
try {
Properties pro = getDbInfo();
//创建数据源 工厂模式
dataSource = BasicDataSourceFactory.createDataSource(pro);
}catch(Exception ex) {
ex.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
//释放连接资源
public static void release(Connection con, PreparedStatement st, ResultSet set){
try {
if (con != null){
con.close();
}
if (st != null){
st.close();
}
if (set != null){
set.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
private static Properties getDbInfo() {
Properties pro = new Properties();
try {
//通过输入流对象读取文件中的数据保存在properties对象中
pro.load(new FileInputStream(new File("src/dbcpconfig.properties")));
} catch (IOException e) {
System.out.println("数据库属性配置信息读取异常");
}
return pro;
}
}
- 测试类
TestDBCP.java
package dao.common;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class TestDBCP {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement st = null;
ResultSet set = null;
String sql = "select * from user";
try{
conn = DbConnection_DBCP.getConnection();
st = conn.prepareStatement(sql);
set = st.executeQuery();
while (set.next()){
System.out.println(set.getString(1));
}
}catch (Exception e){
}finally {
DbConnection_DBCP.release(conn,st,set);
}
}
}
二、C3P0连接池
C3P0:是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate 一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
使用步骤
1.导入jar包
c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar
百度网盘链接:https://pan.baidu.com/s/1nP7aaMyIP6wdqG0r1ScGsw C3P0链接jar包 提取码:9k63
2.具体代码操作
- 配置xml文件
注:.xml配置文件中的&符号需要转义成 & ;
c3p0-config.xml
<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
<!--
C3p0的默认配置
如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource();”这样写表示使用的是c3p0默认的配置
-->
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/hz?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">5</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">20</property>
</default-config>
<!--
c3p0的命名配置
如果在代码中“ComboPooledDataSource ds = new ComboPooledDataSource(“MySQL”);”这样写表示使用的是name是MySQL的配置
-->
<named-config name="MySQL">
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/hz?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">5</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">20</property>
</named-config>
</c3p0-config>
- 实现类
DbConnection_C3P0.java
package dao.common;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class DbConnection_C3P0 {
private static DataSource dataSource = null;
static {
try {
//代码配置
// dataSource = new ComboPooledDataSource();
// dataSource.setDriverClass();
// dataSource.setUser();
// dataSource.setPassword();
// dataSource.setJdbcUrl();
//创建数据源 工厂模式
dataSource = new ComboPooledDataSource("MySQL");//配置文件写法
}catch(Exception ex) {
ex.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
//释放连接资源
public static void release(Connection con, PreparedStatement st, ResultSet set){
try {
if (con != null){
con.close();
}
if (st != null){
st.close();
}
if (set != null){
set.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
- 测试类
TestC3P0.java
package dao.common;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class TestC3P0 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement st = null;
ResultSet set = null;
String sql = "select * from user";
try{
conn = DbConnection_C3P0.getConnection();
st = conn.prepareStatement(sql);
set = st.executeQuery();
while (set.next()){
System.out.println(set.getString(1));
}
}catch (Exception e){
}finally {
DbConnection_C3P0.release(conn,st,set);
}
}
}