Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Java |
![]() ![]() |
Lemkoleg Member Откуда: Сообщений: 199 |
Доброго времени суток. Подскажите ответ на два вопроса: 1. Использую пул соединений OracleDataSource. Вызов getConnection() возвращает соединение. Скажите, это соединение нужно просто закрыть, после использования, или как-то возвратить в пул? 2. Есть ли возможность иметь пул соединений с подготовленными Statement? Или, возможно, пул уже созданных классов, где уже подготовлен Statement. |
30 янв 19, 18:41 [21798171] Ответить | Цитировать Сообщить модератору |
irbis_al Member Откуда: Симферополь Сообщений: 1472 |
Ну вообще пул соединений для того и нужен чтоб держать соединение(сессию) и предоставлять в нужный момент это соединение.(или открывать новое(не более параметра 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] Ответить | Цитировать Сообщить модератору |
Lemkoleg Member Откуда: Сообщений: 199 |
irbis_al, Ок, спасибо. Теперь встречный вопрос: если я присвоил переменной очередное подключение, то что я должен делать с это переменной? Как подключение вернется в пул? |
30 янв 19, 20:03 [21798246] Ответить | Цитировать Сообщить модератору |
irbis_al Member Откуда: Симферополь Сообщений: 1472 |
Ну тут читать api надо . и примеры смотреть(именно в java я не работаю с пулом)
Обычно это connection =OraPool.getconnection();
connection.executesql(sql);
или Statement connection.getstatement(execsql);
connection.commit();
//и по-идее всё ..connection остается подключенной к субд, но свободной для следующего .getconnection();
|
||
30 янв 19, 20:55 [21798276] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 7387 |
Закрыть connection, он вернется в пул По умолчанию, PreparedStatement кэшируется в том числе и между двумя разными получениями connection из пула (кэщ PreparedStatement не сбрасывается при возврате в пул). Но на мой взгляд, это скорее _проблема_, чем преимущество. Кэш настраивается. RTFM, все подробно описано в документации |
31 янв 19, 11:58 [21798593] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 7387 |
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] Ответить | Цитировать Сообщить модератору |
Leonid Kudryavtsev Member Откуда: Сообщений: 7387 |
заново, при наличие запроса точно с таким же типом, просто вернет предыдущий PreparedStatement из кэше. Смысла в этом особого не вижу. Т.к. значение по умолчанию слишком мало (для Oracle вроде 5 запросов), а увеличивать не стоит, т.к. можно натолкнутся на нехватку памяти (для Oracle один статемент может занимать очень много памяти, т.к. хранятся и все служебные буферы обмена с сетью, а они в новых драйверах крайне агрессивные). В общем, дефолтные настройки я бы не трогал и особо с этим не заморачивался. Если работает, пусть работает. |
31 янв 19, 12:09 [21798612] Ответить | Цитировать Сообщить модератору |
Lemkoleg Member Откуда: Сообщений: 199 |
Спасибо всем |
31 янв 19, 14:07 [21798784] Ответить | Цитировать Сообщить модератору |
Все форумы / Java | ![]() |