单例模式作业二: * 某软件公司开发人员要创建一个数据库连接池,将指定个数的(如3个)数据库连接对象存储在连接池中,客户端代码可以从池中随机取一个连接对象来连接数据库。 * 试通过对单例类进行改造,设计一个能够自行提供指定个数实例对象的数据库连接类并用Java代码编程模拟。
时间: 2024-06-12 15:04:37 浏览: 19
首先,我们需要将数据库连接池的代码封装在一个单例类中,以保证全局只有一个连接池实例。同时,我们需要在该类中实现一个方法,用于提供指定个数的数据库连接对象。
代码如下:
```java
public class DBConnectionPool {
private static DBConnectionPool instance;
private List<Connection> connectionPool;
private int poolSize;
private DBConnectionPool(int poolSize) throws SQLException {
this.poolSize = poolSize;
connectionPool = new ArrayList<>(poolSize);
for (int i = 0; i < poolSize; i++) {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
connectionPool.add(connection);
}
}
public static synchronized DBConnectionPool getInstance(int poolSize) throws SQLException {
if (instance == null) {
instance = new DBConnectionPool(poolSize);
}
return instance;
}
public synchronized Connection getConnection() {
Connection connection = null;
if (connectionPool.size() > 0) {
connection = connectionPool.remove(0);
}
return connection;
}
public synchronized void releaseConnection(Connection connection) {
connectionPool.add(connection);
}
}
```
在上述代码中,我们使用了一个List来存储数据库连接对象,使用getConnection()方法从连接池中取出一个连接对象,使用releaseConnection()方法将一个连接对象放回连接池中。
接下来,我们可以编写一个简单的客户端代码来测试我们的数据库连接池:
```java
public class Client {
public static void main(String[] args) throws SQLException {
DBConnectionPool connectionPool = DBConnectionPool.getInstance(3);
for (int i = 0; i < 5; i++) {
Connection connection = connectionPool.getConnection();
if (connection != null) {
System.out.println("取出一个连接对象:" + connection);
connectionPool.releaseConnection(connection);
} else {
System.out.println("连接池已满,无法取出连接对象!");
}
}
}
}
```
在上述客户端代码中,我们通过循环取出5个连接对象,并将每个连接对象放回连接池中(即调用releaseConnection()方法)。在运行该客户端代码时,我们可以看到输出结果如下:
```
取出一个连接对象:com.mysql.cj.jdbc.ConnectionImpl@7f6906c5
取出一个连接对象:com.mysql.cj.jdbc.ConnectionImpl@5b480cf5
取出一个连接对象:com.mysql.cj.jdbc.ConnectionImpl@5d874e9a
连接池已满,无法取出连接对象!
连接池已满,无法取出连接对象!
```
可以看到,当连接池中的连接对象数量不足时,无法再取出连接对象。这是因为我们在创建连接池时,指定了连接池的大小为3,超过这个大小的请求将无法得到满足。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)