需要代码才能在 java 中创建连接池

2022-09-01 08:04:42

需要代码来在 java 中创建连接池?我们如何确保连接池不会返回已在使用的相同对象?如果客户端在从连接池中取出连接后关闭连接,会发生什么情况?

更新 1:

我想用简单的Java术语创建它,并想看看它在多线程Env中是如何工作的。我的意思是哪些方法将同步,哪些方法不会同步。这个类也会是一个公共类吗?如果是,那么任何人都可以访问此类并重新初始化连接池?

更新 2:

我有一些代码如下。但是我不知道“关闭来自池的连接会将其返回到池中,它不会物理关闭连接”。另外,我不明白这一点“因为如果连接是从池中借用的,但尚未返回,则它不”可用“,并且无法重新分配给池的另一个客户端。

import java.util.*;
import java.sql.*;

class ConnectionPoolManager
{

 String databaseUrl = "jdbc:mysql://localhost:3306/myDatabase";
 String userName = "userName";
 String password = "userPass";

 Vector connectionPool = new Vector();

 public ConnectionPoolManager()
 {
  initialize();
 }

 public ConnectionPoolManager(
  //String databaseName,
  String databaseUrl,
  String userName,
  String password
  )
 {
  this.databaseUrl = databaseUrl;
  this.userName = userName;
  this.password = password;
  initialize();
 }

 private void initialize()
 {
  //Here we can initialize all the information that we need
  initializeConnectionPool();
 }

 private void initializeConnectionPool()
 {
  while(!checkIfConnectionPoolIsFull())
  {
   System.out.println("Connection Pool is NOT full. Proceeding with adding new connections");
   //Adding new connection instance until the pool is full
   connectionPool.addElement(createNewConnectionForPool());
  }
  System.out.println("Connection Pool is full.");
 }

 private synchronized boolean checkIfConnectionPoolIsFull()
 {
  final int MAX_POOL_SIZE = 5;

  //Check if the pool size
  if(connectionPool.size() < 5)
  {
   return false;
  }

  return true;
 }

 //Creating a connection
 private Connection createNewConnectionForPool()
 {
  Connection connection = null;

  try
  {
   Class.forName("com.mysql.jdbc.Driver");
   connection = DriverManager.getConnection(databaseUrl, userName, password);
   System.out.println("Connection: "+connection);
  }
  catch(SQLException sqle)
  {
   System.err.println("SQLException: "+sqle);
   return null;
  }
  catch(ClassNotFoundException cnfe)
  {
   System.err.println("ClassNotFoundException: "+cnfe);
   return null;
  }

  return connection;
 }

 public synchronized Connection getConnectionFromPool()
 {
  Connection connection = null;

  //Check if there is a connection available. There are times when all the connections in the pool may be used up
  if(connectionPool.size() > 0)
  {
   connection = (Connection) connectionPool.firstElement();
   connectionPool.removeElementAt(0);
  }
  //Giving away the connection from the connection pool
  return connection;
 }

 public synchronized void returnConnectionToPool(Connection connection)
 {
  //Adding the connection from the client back to the connection pool
  connectionPool.addElement(connection);
 }

 public static void main(String args[])
 {
  ConnectionPoolManager ConnectionPoolManager = new ConnectionPoolManager();
 }

}

答案 1

需要代码来在 java 中创建连接池?

不确定问题是什么,但不要创建另一个连接池,使用现有的解决方案,如C3P0Apache DBCPProxoolBoneCP(该领域的新玩家)。我会使用C3P0。

我们如何确保连接池不会返回已在使用的相同对象?

因为如果某个连接已从池中借用但尚未返回,则该连接不在池中,并且无法分配给池中的其他客户端(资源将从池中删除,直到它们被返回)。

如果客户端在从连接池中取出连接后关闭连接,会发生什么情况?

客户端从池中获取的连接实际上不是 java.sql.Connection,它是 java.sql.Connection 的包装器(代理),用于自定义某些方法的行为。该方法是其中之一,它不会关闭实例,而是将其返回到池中。close()Connection


答案 2

不要写你自己的。有很多图书馆会为你做这件事,它们是开源的,易于使用,并且已经解决了你试图自己制作它时遇到的所有问题。

下面是一个使用Apache的Commons DBCP和Commons Pool的简单示例:

首先设置数据源。

javax.sql.DataSource source = new org.apache.commons.dbcp.BasicDataSource();
source.setDriverClassName("com.mysql.jdbc.Driver");
source.setUsername("username");
source.setPassword("password");
source.setUrl("jdbc:mysql://localhost:3306/myDatabase");

拥有数据源后,即可轻松从池中获取连接。

java.sql.Connection connection = source.getConnection();

关闭连接会将其返回到池中。

connection.close();

推荐