Подтвердить что ты не робот

Я правильно использую 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

4b9b3361

Ответ 1

Это неправильный путь. Источнику данных необходимо управлять любым контейнером, в котором выполняется приложение. MysqlConnectionPoolDataSource - это не пул подключений. Это всего лишь конкретная реализация интерфейса javax.sql.DataSource. Обычно вы определяете его в контексте JNDI и получаете оттуда. Также MySQL сам заявляет все это явно в их документации.

Теперь, как его использовать, это зависит от цели приложения. Если это веб-приложение, вам необходимо передать документацию ресурсов JNDI для сервера servletcontainer/appserver, о котором идет речь. Если это, например, Tomcat, вы можете найти здесь. Если вы используете клиентское приложение, для которого я бы очень сомневался в значении пула соединений, то вам нужно искать структуру объединения пулов, которая может использовать подключенный к MySQL источник данных с пулом, например C3P0.

Другая проблема с отправленным вами кодом заключается в том, что PooledConnection#getConnection() будет возвращать базовое соединение, которое, таким образом, не объединяет соединение. Вызов по нему не вернет соединение с пулом, а просто закроет его. Пул должен каждый раз создавать новое соединение.

Затем рассказ о потоках, который зависит от реальной структуры объединения пулов. C3P0 доказал свою надежность в течение многих лет, вы не беспокоитесь об этом, пока вы пишете код JDBC в соответствии со стандартной идиомой, т.е. Используйте только интерфейсы JDBC и приобретайте и закройте все ресурсы (Connection, Statement и ResultSet) в кратчайшей возможной области.