Форум программистов, компьютерный форум, киберфорум
Java: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Модератор
Эксперт Java
 Аватар для alecss131
2881 / 1387 / 411
Регистрация: 11.08.2017
Сообщений: 4,428
Записей в блоге: 2

Правильно создать ConnectionPool

09.08.2020, 14:33. Показов 1527. Ответов 0

Студворк — интернет-сервис помощи студентам
Решил попробовать создать пул соединений для работы с базой данных. Нашел множество разных способов, не понял как же правильнее это сделать?
Использую PostgreSql в качестве базы данных. Не любллю использовать xml файлы, поэтому jndi как понимаю в пролете (или это не то?). Ну да ладно, тем более этот способ привязан к Томкату.
Если отбросить создание/конфигурирование в томкате, то остается несколько вариантов, создание руками (сразу отбрасываю), используя org.apache.tomcat.jdbc.pool, используя org.apache.commons.dbcp2 и org.postgresql.ds. Для краткости другие опущу. На основе этих 3 библиотек написал 5 вариантов, все 5 работают и в пределах SE программы. Как понимаю надо использовать так называемый Singleton класс.
А вот дальше возникают непонятки, гугл не особо разъяснил. На примере tomcat.jdbc.pool можно создать через встроенный класс ConnectionPool (его тоже оборачивать в sigleton?)
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.tomcat.jdbc.pool.ConnectionPool;
import org.apache.tomcat.jdbc.pool.PoolProperties;
 
public class MyConnectionPool1 {
    private static MyConnectionPool1 instance = null;
    private ConnectionPool cp = null;
 
    private MyConnectionPool1() {
        try {
            Properties p = new Properties();
            p.load(getClass().getResourceAsStream("/conf.properties"));
            PoolProperties pp = new PoolProperties();
            pp.setUrl(p.getProperty("url"));
            pp.setName(p.getProperty("name"));
            pp.setUsername(p.getProperty("username"));
            pp.setPassword(p.getProperty("password"));
            pp.setMaxIdle(Integer.parseInt(p.getProperty("maxIdle")));
            pp.setMinIdle(Integer.parseInt(p.getProperty("minIdle")));
            pp.setDriverClassName(p.getProperty("driverClassName"));
            pp.setInitialSize(Integer.parseInt(p.getProperty("initialSize")));
            pp.setMaxActive(Integer.parseInt(p.getProperty("maxActive")));
            cp = new ConnectionPool(pp);
        } catch (SQLException | IOException e) {
            e.printStackTrace();
        }
    }
    
    public static MyConnectionPool1 getInstance() {
        if (instance == null) {
            instance = new MyConnectionPool1();
        }
        return instance;
    }
    
    public Connection getConnection() throws SQLException {
        return cp.getConnection();
    }
}

а можно и через DataSource (еще вариант использовать DataSourceFactory которому можно просто скормить Properties)
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.tomcat.jdbc.pool.DataSource;
 
public class MyConnectionPool3 {
    private static MyConnectionPool3 instance = null;
    private DataSource ds = null;
 
    private MyConnectionPool3() {
        Properties p = new Properties();
        try {
            p.load(getClass().getResourceAsStream("/conf.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        ds = new DataSource();
        ds.setUrl(p.getProperty("url"));
        ds.setName(p.getProperty("name"));
        ds.setUsername(p.getProperty("username"));
        ds.setPassword(p.getProperty("password"));
        ds.setMaxIdle(Integer.parseInt(p.getProperty("maxIdle")));
        ds.setMinIdle(Integer.parseInt(p.getProperty("minIdle")));
        ds.setDriverClassName(p.getProperty("driverClassName"));
        ds.setInitialSize(Integer.parseInt(p.getProperty("initialSize")));
        ds.setMaxActive(Integer.parseInt(p.getProperty("maxActive")));
    }
    
    public static MyConnectionPool3 getInstance() {
        if (instance == null) {
            instance = new MyConnectionPool3();
        }
        return instance;
    }
    
    public Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}
вариант с фабрикой
Java
1
2
3
            Properties pp = new Properties();
            pp.load(getClass().getResourceAsStream("/conf.properties"));
            ds = new DataSourceFactory().createDataSource(pp);

В commons.dbcp2 создал через BasicDataSource
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp2.BasicDataSource;
 
public class MyConnectionPool4 {
    private static MyConnectionPool4 instance = null;
    private BasicDataSource ds = null;
 
    private MyConnectionPool4() {
        Properties p = new Properties();
        try {
            p.load(getClass().getResourceAsStream("/conf.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        ds = new BasicDataSource();
        ds.setUrl(p.getProperty("url"));
        ds.setUsername(p.getProperty("username"));
        ds.setPassword(p.getProperty("password"));
        ds.setMaxIdle(Integer.parseInt(p.getProperty("maxIdle")));
        ds.setMinIdle(Integer.parseInt(p.getProperty("minIdle")));
        ds.setDriverClassName(p.getProperty("driverClassName"));
        ds.setInitialSize(Integer.parseInt(p.getProperty("initialSize")));
    }
    
    public static MyConnectionPool4 getInstance() {
        if (instance == null) {
            instance = new MyConnectionPool4();
        }
        return instance;
    }
    
    public Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

А в postgresql.ds через PGConnectionPoolDataSource, при этом можно получить помимо обычного Connection какойто PooledConnection
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.PooledConnection;
import org.postgresql.ds.PGConnectionPoolDataSource;
 
public class MyConnectionPool5 {
    private static MyConnectionPool5 instance = null;
    private PGConnectionPoolDataSource ds = null;
 
    private MyConnectionPool5() {
        ds = new PGConnectionPoolDataSource();
        Properties p = new Properties();
        try {
            p.load(getClass().getResourceAsStream("/conf.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        ds.setUrl(p.getProperty("url"));
        ds.setUser(p.getProperty("username"));
        ds.setPassword(p.getProperty("password"));
    }
 
    public static MyConnectionPool5 getInstance() {
        if (instance == null) {
            instance = new MyConnectionPool5();
        }
        return instance;
    }
 
    public PooledConnection getPooledConnection() throws SQLException {
        return ds.getPooledConnection();
    }
 
    public Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

При этом все работает (для примера использовал простой Select). Что из этого лучше и правильнее использовать? И в добавок совсем короткий вопрос, надо ли вызывать метод close у соединения из пула?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2020, 14:33
Ответы с готовыми решениями:

GlassFish ConnectionPool & UTF8
Был проект, сервер Tomcat, connectionPool тоже его, с кодировкой проблем не было. Перешол на GlassFish и соответственно его connectionPool,...

Правильно создать процедуру
Доброго времени суток. Нужно правильно создать процедуру, что по нажатию единственной в программе кнопке выполнялось все после строки...

Правильно создать условие
Здравствуйте! Ребята подскажите как создать условие. Создается список и в нем есть что вставляется картинка НО она должна быть определена...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2020, 14:33
Помогаю со студенческими работами здесь

Как создать правильно
Как создать матрицу???Условие: Если в последней строке матрицы нет отрицательных элементов, увеличить каждый элемент этой строки на...

Правильно создать условие
Добрый день. Есть функционал добавления товара в корзину через сессию. session_start(); if (!isset($_SESSION)) { $_SESSION =...

Правильно создать функцию
Привет всем, помогите разобраться. хочу создать функцию, что бы обращаться к ней таким образом $('div.add_class').addClass('open'); ...

Правильно создать json
Добрый день. $query = mysqli_query($link, "SELECT * FROM `user_device` WHERE `user_id` = '$user_id'"); while($row =...

Правильно создать конструкцию if else
Добрый день! Подскажите, пожалуйста, есть такая конструкция {if $NEW_PRODUCT} <div...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru