JDBC и DataSource: О вреде консерватизма

Как справедливо и неоднократно замечал камрад Markony, самое утомительное в IT — успевать осваивать меняющиеся с умопомрачительной скоростью стандарты. И все-таки время от времени делать это следует, иначе рискуешь остаться на обочине прогресса. Так произошло со мной, когда вместо применения готового стандартного решения время было потрачено на написание собственной реализации пула соединений с базой данных.


Программисты, более-менее знакомые с базами данных, знают, что множество соединений работает гораздо быстрее, чем одно. Только вот хлопот с этим множеством тоже немало: то забудешь закрыть и количество обращений к базе превысит допустимое, то выскочит исключение, прекращающее работу всех клиентов. Не буду перечислять всех подводных камней на пути создания кустарной реализации пула соединений, скажу сразу как надо делать правильно.

Есть в стандартном JRE такой пакет — javax.sql.*. Его интерфейс DataSource — готовое решения для организации пула. Главное — чтобы он был реализован в пакете JDBC для вашей базы данных. Для моего любимого PostgreSQL эта работа выполнена и можно написать так:

import java.sql.*;
import javax.sql.*;

 private DataDource dataSource;

 public DataSource getPgDataSource(String sourceName, String host, String dbName, String user, String passwd, int maxConns){
  org.postgresql.ds.PGPoolingDataSource pgds = new org.postgresql.ds.PGPoolingDataSource(); 
  pgds.setDataSourceName(sourceName);
  pgds.setServerName(host);
  pgds.setDatabaseName(dbName);
  pgds.setUser(user);
  pgds.setPassword(passwd);
  pgds.setMaxConnections(maxConns);
  return (DataSource)pgds;
 }

 

 public void test(){
  if(dataSource == null) dataSource = getPgDataSource("hz", "localhost", "infotester", "yababay", "", 100); 	 
  Connection conn = dataSource.getConnection();
  Statement stmt = conn.createStatement();
  stmt.executeUpdate("INSERT INTO RAW_DATA (B64) VALUES ('GPSSSSSS')");
  stmt.close();
  conn.close();
 }


Этот подход выгодно отличается от старого, когда для каждого соединения нужно было указывать логин, пароль и т.п. DataSource получает учетные записи единожды и потом раздает столько соединений, сколько нужно методом getConnection(). Их количество можно ограничить методом setMaxConnections(). Нужно иметь в виду, что нужно не забывать закрывать соединения после использования, а то можно подвесить систему.

Комментарии (6)

RSS свернуть / развернуть
+
0
Очень полезно!
avatar

Markony

  • 08 мая 2010, 13:00
+
0
Под Android SDK Level 10 (2.3.3) не работает.
avatar

LucidLynx

  • 02 февраля 2012, 17:41
+
0
Уверены, что там не сильно измененная версия JDK?
avatar

Sergei_T

  • 02 февраля 2012, 23:09
+
0
Конечно, измененная. Не хватает класса javax.naming.Referenceable.
avatar

LucidLynx

  • 02 февраля 2012, 23:27
+
0
Думаю yababay вкурсе androidа должен быть что там не хватает
avatar

Sergei_T

  • 02 февраля 2012, 23:32
+
0
Пакеты, начинающиеся с javax (= java extended) являются факультативными для сторонних реализаций Java. Java для Android весьма специфична, и вовсе не обязана поддерживать все возможности классической сановско-оракловской версии. Тем не менее, недостающие классы легко скомпилировать самостоятельно, исходники прилагаются к стандартному JDK (см. src.zip).
avatar

yababay

  • 03 февраля 2012, 22:58

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.