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

Программисты, более-менее знакомые с базами данных, знают, что множество соединений работает гораздо быстрее, чем одно. Только вот хлопот с этим множеством тоже немало: то забудешь закрыть и количество обращений к базе превысит допустимое, то выскочит исключение, прекращающее работу всех клиентов. Не буду перечислять всех подводных камней на пути создания кустарной реализации пула соединений, скажу сразу как надо делать правильно.
Есть в стандартном JRE такой пакет — javax.sql.*. Его интерфейс DataSource — готовое решения для организации пула. Главное — чтобы он был реализован в пакете JDBC для вашей базы данных. Для моего любимого PostgreSQL эта работа выполнена и можно написать так:
Этот подход выгодно отличается от старого, когда для каждого соединения нужно было указывать логин, пароль и т.п. DataSource получает учетные записи единожды и потом раздает столько соединений, сколько нужно методом getConnection(). Их количество можно ограничить методом setMaxConnections(). Нужно иметь в виду, что нужно не забывать закрывать соединения после использования, а то можно подвесить систему.

Программисты, более-менее знакомые с базами данных, знают, что множество соединений работает гораздо быстрее, чем одно. Только вот хлопот с этим множеством тоже немало: то забудешь закрыть и количество обращений к базе превысит допустимое, то выскочит исключение, прекращающее работу всех клиентов. Не буду перечислять всех подводных камней на пути создания кустарной реализации пула соединений, скажу сразу как надо делать правильно.
Есть в стандартном 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 свернуть / развернутьMarkony
LucidLynx
Sergei_T
LucidLynx
Sergei_T
yababay
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.