用java 写一个数据库连接池工具
时间: 2023-08-04 15:10:26 浏览: 143
好的,我可以为您提供一个简单的Java数据库连接池实现,此实现仅用于学习和演示目的。请注意,这不是一个完整的、生产就绪的连接池实现,因为它缺少许多功能,例如:连接泄漏检测、空闲连接检测、最大连接数限制等。
首先,我们需要创建一个数据库连接池类。以下是一个简单的实现:
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class ConnectionPool {
private String jdbcUrl;
private String username;
private String password;
private List<Connection> connectionPool;
private List<Connection> usedConnections = new ArrayList<>();
private final int INITIAL_POOL_SIZE = 10;
public ConnectionPool(String jdbcUrl, String username, String password) {
this.jdbcUrl = jdbcUrl;
this.username = username;
this.password = password;
connectionPool = new ArrayList<>(INITIAL_POOL_SIZE);
for (int i = 0; i < INITIAL_POOL_SIZE; i++) {
try {
Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
connectionPool.add(connection);
} catch (SQLException e) {
System.err.println(e.getMessage());
}
}
}
public synchronized Connection getConnection() {
Connection connection = null;
if (connectionPool.size() > 0) {
connection = connectionPool.remove(connectionPool.size() - 1);
usedConnections.add(connection);
} else {
System.err.println("No more connections available.");
}
return connection;
}
public boolean releaseConnection(Connection connection) {
boolean released = usedConnections.remove(connection);
if (released) {
connectionPool.add(connection);
}
return released;
}
public int getSize() {
return connectionPool.size() + usedConnections.size();
}
public void shutdown() throws SQLException {
usedConnections.forEach(this::releaseConnection);
for (Connection c : connectionPool) {
c.close();
}
connectionPool.clear();
}
}
```
接下来,我们来解释一下上面的代码:
- `jdbcUrl`、`username` 和 `password` 存储了数据库连接的信息。
- `connectionPool` 存储了可用的连接,`usedConnections` 存储了当前正在使用的连接。
- `INITIAL_POOL_SIZE` 是连接池的默认大小,可以根据需要进行修改。
- 在连接池的构造函数中,我们创建了一定数量的连接,并将它们存储在连接池中。
- `getConnection()` 方法从连接池中获取一个可用的连接,如果连接池为空,则返回 `null`。
- `releaseConnection()` 方法将一个连接释放回连接池中。
- `getSize()` 方法返回连接池的大小。
- `shutdown()` 方法关闭连接池中的所有连接,并清空连接池和正在使用的连接列表。
接下来,我们可以编写一个测试类来测试连接池的实现:
```java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestConnectionPool {
public static void main(String[] args) {
String jdbcUrl = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "password";
ConnectionPool connectionPool = new ConnectionPool(jdbcUrl, username, password);
// Get a connection from the pool
Connection connection = connectionPool.getConnection();
try {
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM users");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
System.out.println(resultSet.getString("username"));
}
} catch (SQLException e) {
System.err.println(e.getMessage());
}
// Release the connection back to the pool
connectionPool.releaseConnection(connection);
// Shutdown the connection pool
try {
connectionPool.shutdown();
} catch (SQLException e) {
System.err.println(e.getMessage());
}
}
}
```
在上面的测试类中,我们首先创建了一个连接池对象,并从中获取一个连接。然后,我们使用该连接执行一个查询,并将结果打印到控制台。最后,我们将连接释放回连接池中,并关闭连接池。
希望这可以帮助您开始编写自己的数据库连接池实现!