Простейший Connection pool без DataSource в Java
Ни для кого не секрет, что в Java EE Connection Pool реализуется используя Data Source. С примером реализации в Apache Tomcat можно ознакомиться по этой ссылке: habrahabr.ru/post/101342/. Но что делать, если мы используем только Java SE и нам нужно организовать многопоточный доступ к базе данных по схеме Connection Pool. Ведь сервера приложений у нас в данном случае нет, следовательно, использовать Data Source мы не можем, а для создания соединений к бд нам придется скорее всего использовать java.sql.DriverManager. Можно еще использовать в замену данному подходу что-нибудь из этой статьи: docs.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html. Скорее всего кем-то данный подход уже реализовывался на Java, по крайней мере я не обнаружил такую реализацию в сети. И я решил изобрести свой велосипед. Было бы хорошо, если в поисковике при поиске Connection pool в Java выходила ссылка на эту статью, дополненную и отредактированную по комментариям и дополнениям от habr.ru, и эта статья была бы полезна кому-нибудь. Если стало интересно, то прошу под кат.Реализуем все в виде класса, конструктор которого принимает на вход начальное количество соединений в пуле и параметры подключения к бд (название загружаемого класса из драйвера и строка подключения вместе с именем пользователя и паролем). Назовем класс ConnectionPool, его конструктор будет иметь вид:
public ConnectionPool (String url, String driver, int initConnCnt) {
try {
Class.forName (driver);
} catch (Exception e) {
e.printStackTrace ();
}
this.url = url;
for (int i = 0; i < initConnCnt; i++) {
availableConns.addElement(getConnection());
}
}
url — это строка подключения, для MS SQL Server она будет иметь вид наподобие: jdbc:sqlserver://192.168.0.1;databaseName=dbname;username=username;password=pwd. Можно разделить имя пользователя и пароль, передавать их отдельно в DriverManager. Здесь все в одном месте, по крайней мере мне так показалось удобней. Один из допустимых драйверов для работы с MS SQL Server имеет следующий вид: com.microsoft.sqlserver.jdbc.SQLServerDriver.В данном классе должны объявляться два вектора:
private Vector
class ConnectionPool {
private Vector
public ConnectionPool (String url, String driver, int initConnCnt) { try { Class.forName (driver); } catch (Exception e) { e.printStackTrace (); } this.url = url; for (int i = 0; i < initConnCnt; i++) { availableConns.addElement(getConnection()); } }
private Connection getConnection () { Connection conn = null; try { conn = DriverManager.getConnection (url); } catch (Exception e) { e.printStackTrace (); } return conn; }
public synchronized Connection getConn () throws SQLException { Connection newConn = null; if (availableConns.size () == 0) { newConn = getConnection (); } else { newConn = (Connection) availableConns.lastElement (); availableConns.removeElement (newConn); } usedConns.addElement (newConn); return newConn; }
public synchronized void putConn (Connection c) { if (c!= null) { usedConns.removeElement©; availableConns.addElement©; } }
public int getAvailableConnsCnt () { return availableConns.size (); } }