因为每次创建一个数据库链接都是一次极大的资源消费,所以连接复用。通过建立一个数据库连接池以及一套连接使用管理策略,可以使一个数据库连接可以得到高效、安全的复用,能避免了数据库连接频繁建立、关闭的开销。
连接池的本质:介于 Java 应用 和 JDBC 之间的 Java 架包.
使用 数据库连接池,需要先引入 3 个架包:
- commons-logging
- commons-dbcp2
- commons-pool2
前两个架包可以直接在 apache 找到, pool2 架包在 码农文库中找到;
调用 connection.close() 方法,在连接池中被重写,在连接池中调用 close 方法,是释放归还数据库连接,供其他线程调用,并不是销毁连接。
流程
1.导入 3 个架包
2.初始化连接池
3.通过连接池连接数据库(类似JDBC)
4.拿到结果
5.清理环境
import org.apache.commons.dbcp2.BasicDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class HelloDBCP {
public static BasicDataSource ds = null;
public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
public static final String JDBC_URL = "jdbc:mysql://localhost/test?useSSL=true";
public static final String USER = "root";
public static final String PASSWORD = "admin";
// 初始化 连接池
public static void dbpoolInit() {
ds = new BasicDataSource();
ds.setDriverClassName(JDBC_DRIVER);
ds.setUrl(JDBC_URL);
ds.setUsername(USER);
ds.setPassword(PASSWORD);
}
public void dsPoolTest() {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
conn = ds.getConnection();
stat = conn.createStatement();
rs = stat.executeQuery("select * from user");
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
if (stat != null)
stat.close();
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
dbpoolInit();
new HelloDBCP().dsPoolTest();
}
}
连接池参数配置
BAsicDataSource
.setInitialSize() 在连接池启用的时候预制一定数量的数据库连接
.setMaxTotal() 连接池最大线程连接数
.setMaxWaitMillis() 线程最大等待时间
.setMaxIdle() 空闲连接数超过该设置,连接池销毁数据库连接
.setMinIdle() 空闲连接数低于该设置,连接池创建数据库连接
.setTestWhileIdle(True) 检查空闲数据库连接是否已与数据库断开连接,断开后销毁连接
.setMinEvictableIdleTimeMillis() 销毁连接的最小连接时间,当连接时间超过该设置,被自动销毁
.setTimeBetweenEvicationRunsMillis() 检查运行时间的间隔
网友评论