Java JDBC连接池设计与优化实例
在Java开发中,JDBC(Java Database Connectivity)连接池是一种常用的设计模式,它可以有效管理和复用数据库连接。
以下是一个简单的Java JDBC连接池设计与优化实例:
- 创建连接池类(如ConnectionPool.java)
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
public class ConnectionPool {
private static final String DB_URL = "jdbc:mysql://localhost:3306/testdb";
private static final int MAX_CONNECTIONS = 10; // 连接池最大连接数
private static final int MIN_CONNECTIONS = 5; // 连接池最小连接数
private ConnectionPool() { } // 构造器私有化,防止外部创建
public synchronized static Connection getConnection() {
Connection connection = null;
try {
// 判断连接池状态
if (connectionsInUse() >= MAX_CONNECTIONS) {
// 若连接已经满,等待新的连接释放
connection = waitAndAcquireConnection();
} else {
// 若连接池中还有可用连接,直接获取
connection = DriverManager.getConnection(DB_URL);
}
} catch (Exception e) {
System.out.println("Error occurred while acquiring database connection: " + e.getMessage());
if (connection != null) { // 如果已经获取到的连接,关闭释放
try {
connection.close();
} catch (SQLException se) {
System.out.println("Failed to close database connection after error: " + se.getMessage());
}
}
}
return connection;
}
private static boolean connectionsInUse() {
ConnectionPool pool = ConnectionPool.getInstance();
if (pool != null && !pool.isEmpty()) {
// 如果连接池中有连接,则返回true
return true;
}
return false;
}
private static Connection waitAndAcquireConnection() throws InterruptedException, RejectedExecutionException {
// 将获取连接的任务放入线程池中,等待被处理
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
try {
// 获取数据库连接
Connection connection = DriverManager.getConnection(DB_URL);
// 从连接池中移除这个已使用的连接
ConnectionPool.getInstance().removeConnection(connection);
// 连接返回,用于后续操作
return connection;
} catch (Exception e) {
System.out.println("Error occurred while acquiring database connection: " + e.getMessage());
// 如果获取到的连接有问题,需要关闭释放
try {
if (connection != null) {
connection.close();
}
} catch (SQLException se) {
System.out.println("Failed to close database connection after error: " + se.getMessage());
}
}
}));
}
private static ConnectionPool getInstance() {
// 若连接池尚未创建,创建一个新的连接池实例
if (ConnectionPool.pool == null) {
ConnectionPool.pool = new ConnectionPool();
}
return ConnectionPool.pool;
}
public static void destroy() {
// 如果连接池已经创建,销毁当前的连接池实例
if (ConnectionPool.pool != null) {
ConnectionPool.pool.clear();
ConnectionPool.pool = null;
}
}
}
在这个例子中:
ConnectionPool
是连接池类,它维护一个连接列表。getInstance()
用于获取唯一的连接池实例。getConnection()
是线程安全的获取数据库连接的方法。当连接池中可用连接数量不足时,会阻塞等待直到有新连接释放出来。destroy()
方法用于销毁连接池,清空连接列表。
这个设计在高并发场景下具有较好的性能和资源管理能力。
还没有评论,来说两句吧...