Должны кодировать для создания пула соединения в Java? Как мы удостоверяемся, что пул соединения не возвращает тот же объект, который уже используется? Как происходит, если клиент закрыл соединение после взятия его из пула Соединения?
Я хочу создать это в Простых терминах Java и хотеть видеть, как это работает в ENV Многопоточности. Я имею в виду, какие методы синхронизировались бы и которые не являются. Также будет этот класс быть общедоступным классом? Если да затем кто-либо может получить доступ к этому классу и повторно инициализировать пул соединения?
У меня есть некоторый код как ниже. Но я не делаю, как "Закрытие соединения, прибывающего из пула, возвращает его пулу, это не закрывает соединение физически". Также я не сделал понял это, "Поскольку, если соединение было одолжено от пула и не возвращено уже, это не "доступно" и не может быть перераспределено другому клиенту пула".
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();
}
}
Нужен код для создания пула соединений в java?
Не знаете, в чем заключается вопрос, но не создавайте еще один пул соединений, используйте существующий решение вроде C3P0 , Apache DBCP , Proxool или BoneCP (новый игрок в этой области). Я бы использовал C3P0.
Как мы можем убедиться, что пул соединений не возвращает тот же объект, который уже используется?
Потому что, если соединение было заимствовано из пула и еще не возвращено, его просто нет в пуле и может не назначается другому клиенту пула (ресурсы удаляются из пула до тех пор, пока они не будут возвращены).
Как произойдет, если клиент закрыл соединение после того, как вынул его из пула соединений?
Соединение, которое клиент получает из пула, на самом деле не является java.sql.Connection
, это оболочка (a proxy) для java.sql.Connection
, который настраивает поведение некоторых методов. Метод close ()
является одним из них и не закрывает экземпляр Connection
, а возвращает его в пул.
Не пишите свои собственные. Есть много библиотекарей, которые сделают это за вас, имеют открытый исходный код, просты в использовании и решат все проблемы, с которыми вы столкнетесь, пытаясь сделать это самостоятельно.
Вот простой пример, который использует 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();
Используйте один из существующих, например, Apache DBCP
Соединения, возвращаемые пулом, часто являются прокси, которые "игнорируют" вызов close()
от приложения. Когда соединения возвращаются в пул, их можно использовать повторно. Пулы также закрываются и открываются автоматически, если это необходимо.
Если ваше приложение работает на сервере, то настройте его как источник данных, где сервер позаботится о пулинге, или, если это простой Java-клиент, используйте Apache DBCP (если к базе данных), или используйте Apache Commons Pooling API. См. здесь: Apache Commons