用java写一个简单的连接池
时间: 2023-10-22 19:03:33 浏览: 45
好的,下面是一个简单的 Java 连接池的实现:
```java
import java.sql.*;
import java.util.*;
public class ConnectionPool {
private static ConnectionPool instance = null;
private List<Connection> connectionPool;
private List<Connection> usedConnections;
private String url = "jdbc:mysql://localhost:3306/mydatabase";
private String user = "myuser";
private String password = "mypassword";
private int initialPoolSize = 10;
private int maxPoolSize = 20;
private int increment = 5;
private ConnectionPool() {
connectionPool = new ArrayList<>();
usedConnections = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
for (int i = 0; i < initialPoolSize; i++) {
connectionPool.add(createConnection());
}
}
public static ConnectionPool getInstance() {
if (instance == null) {
instance = new ConnectionPool();
}
return instance;
}
public Connection getConnection() {
if (connectionPool.isEmpty()) {
for (int i = 0; i < increment; i++) {
if (usedConnections.size() < maxPoolSize) {
connectionPool.add(createConnection());
} else {
break;
}
}
}
Connection connection = connectionPool.remove(connectionPool.size() - 1);
usedConnections.add(connection);
return connection;
}
public boolean releaseConnection(Connection connection) {
if (usedConnections.remove(connection)) {
connectionPool.add(connection);
return true;
}
return false;
}
private Connection createConnection() {
Connection connection = null;
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
public void closeAllConnections() {
for (Connection connection : connectionPool) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
for (Connection connection : usedConnections) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
connectionPool.clear();
usedConnections.clear();
}
}
```
这个连接池使用了单例模式(Singleton)来实现,确保在整个应用程序中只有一个连接池实例。连接池包含两个 List 集合,分别存储未被使用的连接和已被使用的连接。在第一次创建连接池实例时,会自动创建一定数量的连接,并将它们存储在未被使用的连接集合中。当需要获取连接时,连接池会先检查未被使用的连接集合中是否还有可用连接。如果没有,就会根据增量值创建一定数量的新连接。如果创建新连接后,总连接数超过了连接池的最大容量,就不再创建新连接。如果有可用连接,连接池会从未被使用的连接集合中取出一个连接,并将它加入已被使用的连接集合中。当使用完连接后,需要调用 releaseConnection() 方法将连接释放回连接池中。最后,连接池还提供了一个方法 closeAllConnections(),用于关闭所有连接并清空连接池。