Мы переносим данные наших приложений из Oracle в PostgreSQL.PostgreSQL не освобождает блокировки из таблицы
Окружающая среда Детали:
Java 1,8
PostgreSQL 9.5 Enterprise Edition (XA DataSource)
Hibernate 4,3
WildFly 9.0.2
Мы используем последнюю версию драйвера PostgreSQL (PostgreSQL-9.4.1212. jdbc42.jar), имеющихся на их веб-сайте (https://jdbc.postgresql.org/download.html)
Редактировать: Также попробовал edb-jdbc17.ja r, который поставляется с postgres enterprise db. Еще один результат.
Мы также установили max_prepared_connections
в 100 в файле postgresql.conf
.
Метод, приведенный ниже, берет объект и использует начальную транзакцию спящего режима, а затем совершает транзакцию. Метод не бросает никаких ошибок или исключений. Но в базе данных объект не сохраняется, и приложение получает блокировки на столе, что приводит к тупиковой ситуации. Тот же код отлично работает с Oracle.
public void createObject(Object obj) throws CSTransactionException {
Session s = null;
Transaction t = null;
try {
try {
obj = performEncrytionDecryption(obj, true);
} catch (EncryptionException e) {
throw new CSObjectNotFoundException(e);
}
try{
obj = ObjectUpdater.trimObjectsStringFieldValues(obj);
}catch(Exception e){
throw new CSObjectNotFoundException(e);
}
s = HibernateSessionFactoryHelper.getAuditSession(sf);
t = s.beginTransaction();
s.save(obj);
t.commit();
s.flush();
auditLog.info("Creating the " + obj.getClass().getName().substring(obj.getClass().getName().lastIndexOf(".")+1) + " Object ");
}
catch (PropertyValueException pve)
{
try {
t.rollback();
} catch (Exception ex3) {
if (log.isDebugEnabled())
log.debug("Authorization|||createObject|Failure|Error in Rolling Back Transaction|" + ex3.getMessage());
}
if (log.isDebugEnabled())
log
.debug("Authorization|||createObject|Failure|Error in Rolling Back Transaction|" + pve.getMessage());
throw new CSTransactionException(
"An error occured in creating the " + StringUtilities.getClassName(obj.getClass().getName()) + ".\n" + " A null value was passed for a required attribute " + pve.getMessage().substring(pve.getMessage().indexOf(":")), pve);
}
catch (ConstraintViolationException cve)
{
try {
t.rollback();
} catch (Exception ex3) {
if (log.isDebugEnabled())
log.debug("Authorization|||createObject|Failure|Error in Rolling Back Transaction|" + ex3.getMessage());
}
if (log.isDebugEnabled())
log
.debug("Authorization|||createObject|Failure|Error in Rolling Back Transaction|" + cve.getMessage());
throw new CSTransactionException(
"An error occured in creating the " + StringUtilities.getClassName(obj.getClass().getName()) + ".\n" + " Duplicate entry was found in the database for the entered data" , cve);
}
catch (Exception ex) {
log.error(ex);
try {
t.rollback();
} catch (Exception ex3) {
if (log.isDebugEnabled())
log
.debug("Authorization|||createObject|Failure|Error in Rolling Back Transaction|"
+ ex3.getMessage());
}
if (log.isDebugEnabled())
log
.debug("Authorization|||createObject|Failure|Error in creating the "
+ obj.getClass().getName()
+ "|"
+ ex.getMessage());
throw new CSTransactionException(
"An error occured in creating the "
+ StringUtilities.getClassName(obj.getClass()
.getName()) + "\n" + ex.getMessage(), ex);
} finally {
try {
s.close();
} catch (Exception ex2) {
if (log.isDebugEnabled())
log
.debug("Authorization|||createObject|Failure|Error in Closing Session |"
+ ex2.getMessage());
}
}
if (log.isDebugEnabled())
log
.debug("Authorization|||createObject|Success|Successful in creating the "
+ obj.getClass().getName() + "|");
}
Замки информации из базы данных:
Я не Эксперт Hibernate, я знаю некоторые о Postgres. Postgres сохраняет блокировку до конца транзакции. Ваш код не заканчивает транзакции. Это довольно серьезная проблема. –
t.commit(); будет сохранять и завершать транзакцию. – Maverick
Посмотрите на postgres - запишите все утверждения или ожидания - возможно, спящий режим не делает этого. параметр pg_stat_activity или log_min_duration_statement может помочь вам. –