Не изобретайте колесо.
Попробуйте один из легко доступных сторонних компонентов:
Apache DBCP предлагает другой пример настройки пула ] javax.sql.DataSource . Вот один пример , который может помочь вам начать работу.
В конце 2017 года Proxool, BoneCP, C3P0, DBCP в настоящее время в основном не функционируют. HikariCP (созданный в 2012 году) кажется многообещающим, удаляет двери из всего остального, о чем я знаю. http://www.baeldung.com/hikaricp
Proxool имеет ряд проблем: - при большой нагрузке может превышать максимальное количество подключений и не возвращаться ниже max - может управлять чтобы не возвращаться к минимальным соединениям даже после истечения срока действия соединений. Может заблокировать весь пул (и все потоки сервера / клиента), если у него возникли проблемы с подключением к базе данных во время потока HouseKeeper (не использует .setQueryTimeout) - поток HouseKeeper при подключении блокировка пула для его процесса, запрашивает поток Prototyper для воссоздания соединений (sweep), что может привести к условию / блокировке гонки. В этом методе последний параметр всегда должен быть развернут: false во время цикла, только подметать: true под ним. - HouseKeeper нуждается только в одиночной прокрутке PrototypeController в конце и имеет больше [упомянутых выше] - поток HouseKeeper проверяет проверку соединений, прежде чем видеть, какие соединения могут быть истекли [некоторый риск тестирования истекшего соединения, которое может быть нарушено / завершено с помощью других тайм-аутов до DB в брандмауэре и т. Д.] - проект имеет незавершенный код (свойства, которые определены, но не действуют). Максимальный срок службы соединения по умолчанию, если он не определен, составляет 4 часа (чрезмерный) - поток HouseKeeper запускается каждые пять секунд на пул (избыток) Вы можете изменить код и внести эти улучшения. Но поскольку он был создан в 2003 году и обновлен в 2008 году, ему не хватало почти 10 лет усовершенствований Java, которые используют такие решения, как hikaricp.
Пул
performance
[путем повторного использования одного и того же объекта для выполнения любых действий над объектными данными] & amp; memory
[выделение и деактивация многих объектов создает значительные издержки управления памятью]. «Пул пула [ Object
, String
Константный пул, Thread
Пул, пул соединений]
String Константный пул
Пример: String для проверки Уникального объекта из пула.
public class StringPoolTest {
public static void main(String[] args) { // Integer.valueOf(), String.equals()
String eol = System.getProperty("line.separator"); //java7 System.lineSeparator();
String s1 = "Yash".intern();
System.out.format("Val:%s Hash:%s SYS:%s "+eol, s1, s1.hashCode(), System.identityHashCode(s1));
String s2 = "Yas"+"h".intern();
System.out.format("Val:%s Hash:%s SYS:%s "+eol, s2, s2.hashCode(), System.identityHashCode(s2));
String s3 = "Yas".intern()+"h".intern();
System.out.format("Val:%s Hash:%s SYS:%s "+eol, s3, s3.hashCode(), System.identityHashCode(s3));
String s4 = "Yas"+"h";
System.out.format("Val:%s Hash:%s SYS:%s "+eol, s4, s4.hashCode(), System.identityHashCode(s4));
}
}
Пул соединений с использованием Type-4 Драйвер с использованием сторонних библиотек [ DBCP2
, c3p0
, Tomcat JDBC
]
Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora].
wiki
В механизме пула соединений, когда класс загружен он получает physical JDBC connection
объекты и предоставляет физический объект подключения для пользователя. PoolableConnection
является оберткой вокруг фактического соединения.
getConnection()
выберите одно из бесплатного завернутого соединения из соединения objectpool и возвращает его. close()
вместо закрытия возвращает обратно завершенное соединение в пул. Пример: Использование пула соединений ~ DBCP2 с Java 7 [ try-with-resources
]
public class ConnectionPool {
static final BasicDataSource ds_dbcp2 = new BasicDataSource();
static final ComboPooledDataSource ds_c3p0 = new ComboPooledDataSource();
static final DataSource ds_JDBC = new DataSource();
static Properties prop = new Properties();
static {
try {
prop.load(ConnectionPool.class.getClassLoader().getResourceAsStream("connectionpool.properties"));
ds_dbcp2.setDriverClassName( prop.getProperty("DriverClass") );
ds_dbcp2.setUrl( prop.getProperty("URL") );
ds_dbcp2.setUsername( prop.getProperty("UserName") );
ds_dbcp2.setPassword( prop.getProperty("Password") );
ds_dbcp2.setInitialSize( 5 );
ds_c3p0.setDriverClass( prop.getProperty("DriverClass") );
ds_c3p0.setJdbcUrl( prop.getProperty("URL") );
ds_c3p0.setUser( prop.getProperty("UserName") );
ds_c3p0.setPassword( prop.getProperty("Password") );
ds_c3p0.setMinPoolSize(5);
ds_c3p0.setAcquireIncrement(5);
ds_c3p0.setMaxPoolSize(20);
PoolProperties pool = new PoolProperties();
pool.setUrl( prop.getProperty("URL") );
pool.setDriverClassName( prop.getProperty("DriverClass") );
pool.setUsername( prop.getProperty("UserName") );
pool.setPassword( prop.getProperty("Password") );
pool.setValidationQuery("SELECT 1");// SELECT 1(mysql) select 1 from dual(oracle)
pool.setInitialSize(5);
pool.setMaxActive(3);
ds_JDBC.setPoolProperties( pool );
} catch (IOException e) { e.printStackTrace();
} catch (PropertyVetoException e) { e.printStackTrace(); }
}
public static Connection getDBCP2Connection() throws SQLException {
return ds_dbcp2.getConnection();
}
public static Connection getc3p0Connection() throws SQLException {
return ds_c3p0.getConnection();
}
public static Connection getJDBCConnection() throws SQLException {
return ds_JDBC.getConnection();
}
}
public static boolean exists(String UserName, String Password ) throws SQLException {
boolean exist = false;
String SQL_EXIST = "SELECT * FROM users WHERE username=? AND password=?";
try ( Connection connection = ConnectionPool.getDBCP2Connection();
PreparedStatement pstmt = connection.prepareStatement(SQL_EXIST); ) {
pstmt.setString(1, UserName );
pstmt.setString(2, Password );
try (ResultSet resultSet = pstmt.executeQuery()) {
exist = resultSet.next(); // Note that you should not return a ResultSet here.
}
}
System.out.println("User : "+exist);
return exist;
}
jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName>
jdbc:
oracle
:thin:@localhost:1521:myDBName
jdbc:
mysql
://localhost:3306/myDBName
connectionpool.properties
URL : jdbc:mysql://localhost:3306/myDBName
DriverClass : com.mysql.jdbc.Driver
UserName : root
Password :
Веб Приложение: Кому избегайте проблем подключения, когда все соединения закрыты [MySQL «wait_timeout» по умолчанию 8 часов], чтобы повторно открыть соединение с базовым БД.
Вы можете сделать это, чтобы проверить каждый Соединение путем установки testOnBorrow = true и validationQuery = «SELECT 1» и donot использует autoReconnect для сервера MySQL, поскольку он устарел. issue
===== ===== context.xml ===== =====
<?xml version="1.0" encoding="UTF-8"?>
<!-- The contents of this file will be loaded for a web application -->
<Context>
<Resource name="jdbc/MyAppDB" auth="Container"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
type="javax.sql.DataSource"
initialSize="5" minIdle="5" maxActive="15" maxIdle="10"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="30000"
testOnBorrow="true"
validationQuery="SELECT 1"
validationInterval="30000"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/myDBName"
username="yash" password="777"
/>
</Context>
===== ===== web.xml ===== =====
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/MyAppDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
===== ===== DBOperations ===== =====
servlet « init() {}
Normal call used by sevlet « static {}
static DataSource ds;
static {
try {
Context ctx=new InitialContext();
Context envContext = (Context)ctx.lookup("java:comp/env");
ds = (DataSource) envContext.lookup("jdbc/MyAppDB");
} catch (NamingException e) { e.printStackTrace(); }
}
См. также:
public class StringPoolTest
есть только два метода void, поэтому они ничего не возвращают. Этот код действительно проходит процесс управления пулом строк? Кажется, он даже не использует никаких аргументов.
– jeffery_the_wind
6 July 2016 в 08:59
ConnectionPool
. Спасибо.
– jeffery_the_wind
6 July 2016 в 10:19
Я бы рекомендовал использовать библиотеку commons-dbcp . Существует множество примеров , которые перечислены о том, как его использовать, вот ссылка на перемещение простой . Использование очень просто:
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver")
ds.setUsername("scott");
ds.setPassword("tiger");
ds.setUrl(connectURI);
...
Connection conn = ds.getConnection();
Вам нужно только создать источник данных один раз, поэтому убедитесь, что вы прочитали документацию, если не знаете, как это сделать. Если вы не знаете, как правильно писать инструкции JDBC, чтобы не утечка ресурсов, вам также может понадобиться прочитать эту страницу Wikipedia .
javax.sql.DataSource
содержит реализацию «Объединение пулов». (кроме того, я думаю, вы уже знаете, что такое интерфейс JDBC)
– Eddy
14 November 2016 в 10:26
Как уже было сказано другими, вы, вероятно, будете довольны Apache Dbcp или c3p0 .
Не имеет ли javax.sql или java.sql объединения реализаций соединений?
Что касается вашего сомнения
Почему бы не использовать их лучше?
Они не предоставляют реализаций, а скорее интерфейсов и некоторых классов поддержки, но только для программистов, которые реализуют сторонние библиотеки (пулы или драйверы ). Обычно вы даже не смотрите на это. Ваш код должен иметь дело с соединениями из вашего пула, так же, как и «простые» соединения прозрачным способом.
MiniConnectionPoolManager
является реализацией одного Java-файла, если вы ищете встраиваемое решение и не слишком озабочены действиями (хотя я не тестировал его в этом отношении) .
Это многопрофильный EPL , LGPL и MPL .
В его документации также дает альтернативы, заслуживающие проверки (над DBCP и C3P0):
Вы должны рассмотреть возможность использования UCP. Пул универсальных подключений (UCP) - пул соединений Java. Это богатый возможностями пул соединений и тесно интегрирован с базами данных Oracle Real Application Clusters (RAC), ADG, DG.
На сервере приложений мы используем то, где я работаю (Oracle Application Server 10g, как я помню), пул обрабатывается сервером приложений. Мы извлекаем javax.sql.DataSource
с помощью поиска JNDI с помощью javax.sql.InitialContext
.
он сделал что-то вроде этого
try {
context = new InitialContext();
jdbcURL = (DataSource) context.lookup("jdbc/CachedDS");
System.out.println("Obtained Cached Data Source ");
}
catch(NamingException e)
{
System.err.println("Error looking up Data Source from Factory: "+e.getMessage());
}
(Мы не пишем этот код, он скопирован из этой документации .)
Для этой цели Apache Commons имеет библиотеку: DBCP . Если у вас нет странных требований к вашим пулам, я бы использовал библиотеку, поскольку она будет сложнее и тонче, чем вы могли бы надеяться.
Обычно, если вам нужен пул соединений, вы пишете приложение, которое выполняется в некоторой управляемой среде, то есть вы работаете на сервере приложений. Если это так, убедитесь, что проверьте, какие средства пула соединений, которые ваш сервер приложений предоставляет , перед тем, как попробовать какие-либо другие параметры.
Исходное решение будет лучше всего интегрировано с остальными ресурсами серверов приложений. Если, однако, вы не работаете внутри сервера приложений, я бы порекомендовал компонент Apache Commons DBCP . Он широко используется и обеспечивает всю базовую функциональность объединения, требуемую большинством приложений.
Это современно, быстро, просто. Я использую его для каждого нового проекта. Я предпочитаю это много над C3P0, не знаю, что другие пулы слишком хорошо.
disclecsia
стал лучше меня. Вы можете видеть, что ссылка верна. :) – Alexander Pogrebnyak 15 May 2010 в 14:48tomcat-jdbc
. Вы можете получить его от Maven Central - & gt;org.apache.tomcat:tomcat-jdbc:jar:7.0.22
- & gt; search.maven.org/… – Alexander Pogrebnyak 18 November 2011 в 16:20