1.实现步骤
/**
* @author LJL
* @version 1.0
* @title ConnectionPoolConfiguration
* @date 2023/6/9 18:47
* @description 连接池的配置类
*/
public class ConnectionPoolConfiguration {
private final String url;
private final String username;
private final String password;
private final int maxConnections;
// 其他属性
public ConnectionPoolConfiguration(String url, String username, String password, int maxConnections) {
this.url = url;
this.username = username;
this.password = password;
this.maxConnections = maxConnections;
}
public String getUrl() {
return url;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public int getMaxConnections() {
return maxConnections;
}
}
/**
* @author LJL
* @version 1.0
* @title ConnectionPool
* @date 2023/6/9 19:25
* @description 连接池接口
*/
public interface ConnectionPool {
void init(ConnectionPoolConfiguration connectionPoolConfiguration) throws SQLException;
void destroy() throws SQLException;
Connection getConnection() throws SQLException;
void releaseConnection(Connection conn);
}
/**
* @author LJL
* @version 1.0
* @title ConnectionPoolImpl
* @date 2023/6/9 18:49
* @description 连接池
*/
public class ConnectionPoolImpl implements ConnectionPool {
private final ConnectionPoolConfiguration configuration;
private LinkedList<Connection> connectionQueue = new LinkedList<>();
private int currentConnections = 0;
public ConnectionPoolImpl(ConnectionPoolConfiguration configuration){
this.configuration = configuration;
}
private Connection createConnection() throws SQLException {
currentConnections++;
return DriverManager.getConnection(configuration.getUrl(), configuration.getUsername(),
configuration.getPassword());
}
@Override
public void init(ConnectionPoolConfiguration configuration) throws SQLException {
for (int i = 0; i < configuration.getMaxConnections(); i++) {
connectionQueue.offer(createConnection());
}
}
@Override
public void destroy() throws SQLException {
SQLException exception = null;
for (Connection conn : connectionQueue) {
try {
conn.close();
} catch (SQLException e) {
exception = e;
}
}
connectionQueue.clear();
currentConnections = 0;
if (exception != null) {
throw exception;
}
}
public synchronized Connection getConnection() throws SQLException {
if (connectionQueue.isEmpty()) {
if (currentConnections < configuration.getMaxConnections()) {
return createConnection();
} else {
try {
wait();
} catch (InterruptedException e) {
// 中断线程
Thread.currentThread().interrupt();
}
return getConnection();
}
}
Connection connection = connectionQueue.poll();
if (connection != null) {
notifyAll();
}
return connection;
}
public synchronized void releaseConnection(Connection connection) {
if (connection != null) {
connectionQueue.offer(connection);
notifyAll();
}
}
}
public class Test {
public static void main(String[] args) throws SQLException {
ConnectionPoolConfiguration configuration = new ConnectionPoolConfiguration("jdbc:mysql://localhost:3306/mydatabase", "root", "password", 10);
ConnectionPoolImpl connectionPoolImpl = new ConnectionPoolImpl(configuration);
Connection connection = null;
try {
connection = connectionPoolImpl.getConnection();
// 使用数据库连接执行业务逻辑
} catch (SQLException e) {
// 处理异常情况
} finally {
connectionPoolImpl.releaseConnection(connection);
}
}
}