Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Вопрос по OracleDataSource  [new]
Lemkoleg
Member

Откуда:
Сообщений: 199
Доброго времени суток. Подскажите ответ на два вопроса:
1. Использую пул соединений OracleDataSource. Вызов getConnection() возвращает соединение. Скажите, это соединение нужно просто закрыть, после использования, или как-то возвратить в пул?
2. Есть ли возможность иметь пул соединений с подготовленными Statement? Или, возможно, пул уже созданных классов, где уже подготовлен Statement.
30 янв 19, 18:41    [21798171]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по OracleDataSource  [new]
irbis_al
Member

Откуда: Симферополь
Сообщений: 1472
Lemkoleg
Доброго времени суток. Подскажите ответ на два вопроса:
1. Использую пул соединений OracleDataSource. Вызов getConnection() возвращает соединение. Скажите, это соединение нужно просто закрыть, после использования, или как-то возвратить в пул?
2. Есть ли возможность иметь пул соединений с подготовленными Statement? Или, возможно, пул уже созданных классов, где уже подготовлен Statement.

Ну вообще пул соединений для того и нужен чтоб держать соединение(сессию)
и предоставлять в нужный момент это соединение.(или открывать новое(не более параметра max pool connection) если все заняты.(иначе ставить в очередь на ожидание освободившегося)
и поэтому его закрывать не надо.
а заморачиваться с подготовленными Statement не надо...Сам оракле подготавливает кэш запроса .(Так называемый "прогретый кэш субд") Единственное за чем нужно следить это чтоб Sataement был параметрическим.
Типа
select * from table where id=:id 

Тогда это один подготовленный запрос в кэше оракла.
а если
хардкодно
select * from table where id=1;
select * from table where id=2;
...
select * from table where id=N;

Тогда это N запросов в кэше СУБД и админ оракле идет к Вам стучать в "тыкву" :-)
30 янв 19, 19:27    [21798214]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по OracleDataSource  [new]
Lemkoleg
Member

Откуда:
Сообщений: 199
irbis_al,
Ок, спасибо.
Теперь встречный вопрос: если я присвоил переменной очередное подключение, то что я должен делать с это переменной? Как подключение вернется в пул?
30 янв 19, 20:03    [21798246]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по OracleDataSource  [new]
irbis_al
Member

Откуда: Симферополь
Сообщений: 1472
Lemkoleg
irbis_al,
Ок, спасибо.
Теперь встречный вопрос: если я присвоил переменной очередное подключение, то что я должен делать с это переменной? Как подключение вернется в пул?


Ну тут читать api надо . и примеры смотреть(именно в java я не работаю с пулом)
Обычно это connection =OraPool.getconnection();
connection.executesql(sql);
или Statement connection.getstatement(execsql);
connection.commit();
//и по-идее всё ..connection остается подключенной к субд, но свободной для следующего .getconnection();
30 янв 19, 20:55    [21798276]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по OracleDataSource  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7387
Закрыть connection, он вернется в пул

По умолчанию, PreparedStatement кэшируется в том числе и между двумя разными получениями connection из пула (кэщ PreparedStatement не сбрасывается при возврате в пул). Но на мой взгляд, это скорее _проблема_, чем преимущество. Кэш настраивается. RTFM, все подробно описано в документации
31 янв 19, 11:58    [21798593]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по OracleDataSource  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7387
irbis_al
а заморачиваться с подготовленными Statement не надо...Сам оракле подготавливает кэш запроса .(Так называемый "прогретый кэш субд") Единственное за чем нужно следить это чтоб Sataement был параметрическим.

I. Мне кажется автор топика имел в виду PreparedStatement vs Statement

В этом случае:
1. Создали connection / получили из пула
2. Создали PreparedStatement'ы в данном connection
3. Работаем с ними....
4. Закрыли PreparedStatement'ы
5. Закрыли connection

II. Вы описываете серверную часть, soft parse vs hard parse. Но если prepared statement создан, то как я понимаю, последующих parse (в Oracle) не будет вообще. Т.к. информация о возврашаемых типах хранится в незакрытом PreparedStatement

III. В JDBC ( Oracle, PostgreSQL ) есть кэшь PreparedStatement'ов. Попытка создать PreparedStatement
31 янв 19, 12:05    [21798602]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по OracleDataSource  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7387
заново, при наличие запроса точно с таким же типом, просто вернет предыдущий PreparedStatement из кэше. Смысла в этом особого не вижу. Т.к. значение по умолчанию слишком мало (для Oracle вроде 5 запросов), а увеличивать не стоит, т.к. можно натолкнутся на нехватку памяти (для Oracle один статемент может занимать очень много памяти, т.к. хранятся и все служебные буферы обмена с сетью, а они в новых драйверах крайне агрессивные). В общем, дефолтные настройки я бы не трогал и особо с этим не заморачивался. Если работает, пусть работает.
31 янв 19, 12:09    [21798612]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по OracleDataSource  [new]
Lemkoleg
Member

Откуда:
Сообщений: 199
Спасибо всем
31 янв 19, 14:07    [21798784]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить