Нужен Код для создания Пула Соединения в Java

Должны кодировать для создания пула соединения в 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();
 }

}
31
задан Bill the Lizard 13 May 2010 в 14:34
поделиться

4 ответа

Нужен код для создания пула соединений в java?

Не знаете, в чем заключается вопрос, но не создавайте еще один пул соединений, используйте существующий решение вроде C3P0 , Apache DBCP , Proxool или BoneCP (новый игрок в этой области). Я бы использовал C3P0.

Как мы можем убедиться, что пул соединений не возвращает тот же объект, который уже используется?

Потому что, если соединение было заимствовано из пула и еще не возвращено, его просто нет в пуле и может не назначается другому клиенту пула (ресурсы удаляются из пула до тех пор, пока они не будут возвращены).

Как произойдет, если клиент закрыл соединение после того, как вынул его из пула соединений?

Соединение, которое клиент получает из пула, на самом деле не является java.sql.Connection , это оболочка (a proxy) для java.sql.Connection , который настраивает поведение некоторых методов. Метод close () является одним из них и не закрывает экземпляр Connection , а возвращает его в пул.

46
ответ дан 27 November 2019 в 21:40
поделиться

Не пишите свои собственные. Есть много библиотекарей, которые сделают это за вас, имеют открытый исходный код, просты в использовании и решат все проблемы, с которыми вы столкнетесь, пытаясь сделать это самостоятельно.

Вот простой пример, который использует Apache Commons DBCP и Commons Pool:

Сначала настройте DataSource.

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();
14
ответ дан 27 November 2019 в 21:40
поделиться

Используйте один из существующих, например, Apache DBCP

Соединения, возвращаемые пулом, часто являются прокси, которые "игнорируют" вызов close() от приложения. Когда соединения возвращаются в пул, их можно использовать повторно. Пулы также закрываются и открываются автоматически, если это необходимо.

4
ответ дан 27 November 2019 в 21:40
поделиться

Если ваше приложение работает на сервере, то настройте его как источник данных, где сервер позаботится о пулинге, или, если это простой Java-клиент, используйте Apache DBCP (если к базе данных), или используйте Apache Commons Pooling API. См. здесь: Apache Commons

2
ответ дан 27 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: