对不起标题,我无法决定如何表达问题。
我有2个项目使用相同的ms sql server数据库。两者都是春季项目,春季是处理交易。
在一种情况下,第一个项目是创建一个实体对象,然后将其id发送到具有rest服务的其他项目。如:
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>
但问题是&#34; sessionFactory.getCurrentSession()。get(Message.class,id)&#34; metod没有返回结果,实际上程序被锁定在那里。
我想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 :(得分:0)
假设您希望主要遵循当前的方法,请确保第一次致电
sessionFactory.getCurrentSession().save(message);
和第二次电话
sessionFactory.getCurrentSession().saveOrUpdate(message);
(两者都在“第一个项目”中完成)使用不同的会话。这样hibernate就不会锁定任何行。根据您使用Spring的方式,您可以通过在第一个项目中使用两个“交易括号”来获得两个sessoins。