2014-11-01 2 views
0

Извините за титул, я не мог решить, как выразить эту проблему.hibernate locks row on seproate projects with spring transactional service

У меня есть 2 проекта, которые используют ту же самую базу данных ms sql server. Оба являются весенними проектами, а весна - транзакциями.

В одной ситуации первый проект создает объект объекта, а затем отправляет его идентификатор другому проекту с сервисом отдыха. Такие, как:

Message message = new Message(); 
<filling message's properties> 
sessionFactory.getCurrentSession().save(message); 
String url = <proper url> 
MultiValueMap<String, String> mvm = new LinkedMultiValueMap<String, String>(); 
mvm.add("id", message.getId()); 
String response = restTemplate.postForObject(url, mvm, String.class); 
message.setStatus("Send to service"); 
sessionFactory.getCurrentSession().saveOrUpdate(message); 

restTemplate.postForObject успешно отправляет необходимые данные на отдых обслуживание и сервис, как следует:.

Message message = (Message) sessionFactory.getCurrentSession().get(Message.class, id); 
message.setSendingTime(new Date()); 
kepMesajDAO.merge(message); 
<message process> 

Но проблема «sessionFactory.getCurrentSession() получить (Message.class, id) «Метод не возвращает результат, на самом деле программа там заблокирована.

Я думаю, что hibernate блокирует мой сохраненный объект, а второй проект ждет разблокировки, но поскольку первый проект ждет ответа от второго проекта, он никогда не разблокируется.

Как справиться с этой ситуацией.

PS. Я попытался закрыть или отключить соединение в первом проекте я получил исключение из весны, такие как:

Caused by: org.hibernate.TransactionException: commit failed 
     at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:185) 
     at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:480) 
     ... 44 more 
Caused by: org.hibernate.TransactionException: unable to commit against JDBC connection 
     at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:116) 
     at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:178) 
     ... 45 more 
Caused by: java.sql.SQLException: Connection is closed. 
     at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.checkOpen(PoolingDataSource.java:175) 
     at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.commit(PoolingDataSource.java:199) 
     at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:112) 
     ... 46 more 

ответ

0

Предполагая, что вы хотите, чтобы в основном придерживаться текущего подхода, убедитесь, что при первом вызове

sessionFactory.getCurrentSession().save(message); 

и второй звонок

sessionFactory.getCurrentSession().saveOrUpdate(message); 

(оба выполняются в «первом проекте») используют другую сессию. Таким образом, hibernate не будет блокировать любые строки. В зависимости от того, как вы используете Spring, вы можете получить два sessoins, имея два «скобки транзакций» в вашем первом проекте.

+0

эти два вызова находятся на разных классах, после сохранения я вызываю метод, называемый sendToRest из разных компонентов, а остальная часть кода относится к этому методу. – bdogru

+0

Не могли бы вы расширить свой вопрос? Какую стратегию вы выбрали для управления сеансами спящего режима, т. Е. Какой тип CurrentSessionContext активен? Связаны ли ваши сеансы с транзакцией JTA, threadlocal, ...? – Hille