Я правильно использую Java PooledConnections?
Я хочу использовать объединенные соединения с Java (потому что это дорого стоит создать одно соединение для потока), поэтому я использую объект MysqlConnectionPoolDataSource()
. Я сохраняю свой источник данных по потокам. Итак, я использую только один источник данных для всего приложения:
startRegistry(); // creates an RMI registry for MySQL
MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();
dataSource.setUser("username");
dataSource.setPassword("password");
dataSource.setServerName("serverIP");
dataSource.setPort(3306);
dataSource.setDatabaseName("dbname");
InitialContext context = createContext(); // Creates a context
context.rebind("MySQLDS", dataSource);
Теперь, когда я создал свой источник данных, я делаю следующее в каждом отдельном потоке:
PooledConnection connect = dataSource.getPooledConnection();
Connection sqlConnection = connect.getConnection();
Statement state = sqlConnection.createStatement();
ResultSet result = state.executeQuery("select * from someTable");
// Continue processing results
Я предполагаю, что я запутался, это вызов dataSource.getPooledConnection();
Является ли это действительно собиранием объединенного соединения? И этот поток безопасен?
Я заметил, что у PooledConnection есть методы вроде notify() и wait()... что означает, что я не думаю, что это делает то, что я думаю, что он делает...
Также, когда и как я должен освободить соединение?
Мне интересно, было бы выгоднее катиться самостоятельно, потому что тогда я буду более знаком со всем, но я действительно не хочу изобретать колесо в этом случае:).
Спасибо SO
Ответы
Ответ 1
Это неправильный путь. Источнику данных необходимо управлять любым контейнером, в котором выполняется приложение. MysqlConnectionPoolDataSource
- это не пул подключений. Это всего лишь конкретная реализация интерфейса javax.sql.DataSource
. Обычно вы определяете его в контексте JNDI и получаете оттуда. Также MySQL сам заявляет все это явно в их документации.
Теперь, как его использовать, это зависит от цели приложения. Если это веб-приложение, вам необходимо передать документацию ресурсов JNDI для сервера servletcontainer/appserver, о котором идет речь. Если это, например, Tomcat, вы можете найти здесь. Если вы используете клиентское приложение, для которого я бы очень сомневался в значении пула соединений, то вам нужно искать структуру объединения пулов, которая может использовать подключенный к MySQL источник данных с пулом, например C3P0.
Другая проблема с отправленным вами кодом заключается в том, что PooledConnection#getConnection()
будет возвращать базовое соединение, которое, таким образом, не объединяет соединение. Вызов по нему не вернет соединение с пулом, а просто закроет его. Пул должен каждый раз создавать новое соединение.
Затем рассказ о потоках, который зависит от реальной структуры объединения пулов. C3P0 доказал свою надежность в течение многих лет, вы не беспокоитесь об этом, пока вы пишете код JDBC в соответствии со стандартной идиомой, т.е. Используйте только интерфейсы JDBC и приобретайте и закройте все ресурсы (Connection
, Statement
и ResultSet
) в кратчайшей возможной области.