BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 21 июн 2025, 00:39

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: 03 авг 2012, 14:06 
Не в сети
Клиент

Зарегистрирован: 30 мар 2009, 17:51
Сообщения: 431
Карма: 23
Добрый день.
Готовлюсь к переезду на 5.2, просматриваю все скрипты на предмет изменения апи.
В одном из используемых костылей/сервлетов у меня используется конструкция вида

Код:
Connection con=setup.getDBConnectionFromPool();
try{...
}
catch(SQLException e){log(e);}
catch(Exception e){log(e);}
finally{
con.close();
}


Первое что пришло в голову - не закрывать соединение, а возвращать его в пул обратно, но Setup.returnConToPool(con) @Deprecated... Пишут использовать Utils#closeConnection. Поискал, есть метод ServerUtils.closeConnection(con) - но это опять же закрытие... Отсюда вопрос номер 1. Так все-таки закрывать соединение или возвращать в пул?

Вопрос номер два который всплыл во время просмотра этого класса ServerUtils... там есть метод commitConnection(con)... Зачем он? можно же con.commit() вызывать? там вроде никаких эксепшенов не бросается даже как при close(), так что нечего оборачивать в другие методы...

Ну и третий вопрос про innodb и плюхи транзакций... хочу использовать роллбэк при отловле ошибок, а то сейчас ошибка в середине скрипта - половина данных изменилась, половина нет, а тут можно было бы ошибку поймать - сделать роллбэк и все, но с транзакциями до этого не работал, отсюда вопросы. видимость изменений какая? допустим если я работаю в пределах метода с одним коннекшеном, то обращения через него будут видеть уже измененные данные? т.е. я делаю инсерт каких то данных, потом через этот же коненшн делаю выборку? Как я себе это представляю - внутри try работаем работаем, а потом finally commit... ну и catch ->rollback и все красиво =) Если нет, то это надо использовать сэйвпоинт в самом начале ставить и потом уже на него делать роллбэк
Вторая часть вопроса - при получении getDBConnectionFromPool - у этого соединения автокомит включен или надо его отрубать?
Заключительная часть вопроса. Соединение при получении его из пула блокируется и не доступно до момента возврата в пул? Не получится ли так что два потока будут иметь одно соединение и ролбэк в одном из потоков приведет к откату в другом?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 авг 2012, 16:38 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
При con.close() соединение просто вернется в пул, так что можно и так оставить.

Вполне можно не использовать метод commitConnection.

Если используете новую схему - там в скрипт передается объект connectionSet - в нем есть метод setAutocommit( boolean ). Т.е. в скрипте (динамическом классе) в самом начале работы сделать connectionSet.setAutocommit( false );, должно работать как вы хотите. Единственное - если делать много разных изменений в транзакции, то нужно делать осторожно(правильно, в определенном порядке желательно), иначе могут возникать постоянные deadlock'и.

При получении getDBConnectionFromPool autocommit по умолчанию true.
Нет, не получится.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 авг 2012, 07:25 
Не в сети
Клиент

Зарегистрирован: 30 мар 2009, 17:51
Сообщения: 431
Карма: 23
Amir писал(а):
При con.close() соединение просто вернется в пул, так что можно и так оставить.

Вполне можно не использовать метод commitConnection.

Если используете новую схему - там в скрипт передается объект connectionSet - в нем есть метод setAutocommit( boolean ). Т.е. в скрипте (динамическом классе) в самом начале работы сделать connectionSet.setAutocommit( false );, должно работать как вы хотите. Единственное - если делать много разных изменений в транзакции, то нужно делать осторожно(правильно, в определенном порядке желательно), иначе могут возникать постоянные deadlock'и.

При получении getDBConnectionFromPool autocommit по умолчанию true.
Нет, не получится.

спасибо =)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.054s | 22 Queries | GZIP : On ]