Java Spring ReadOnly Transaction with Propagation.SUPPORTS with WebSphere和Oracle
由于从Hibernate 3.6切换到Hibernate 4.1.x,我在事务/会话管理方面遇到了一些问题 我使用Spring3.1.2、Hibernate4.1.4、WebSphere8.5和Oracle11 在我的WebApp中,我用以下标记了一些方法:Java Spring ReadOnly Transaction with Propagation.SUPPORTS with WebSphere和Oracle,java,oracle,spring,hibernate,websphere,Java,Oracle,Spring,Hibernate,Websphere,由于从Hibernate 3.6切换到Hibernate 4.1.x,我在事务/会话管理方面遇到了一些问题 我使用Spring3.1.2、Hibernate4.1.4、WebSphere8.5和Oracle11 在我的WebApp中,我用以下标记了一些方法: @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) 这对于我使用OpenSessionInViewFilter和getSessionFactory.get
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
这对于我使用OpenSessionInViewFilter和getSessionFactory.getCurrentSession的webapp来说效果很好
但是我的一些代码被JMS或Quartz作业调用,而没有OpenSessionInViewFilter导致
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
在互联网上进行了一些研究后,我将我的交易更改为:
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
现在有一个开放会话,Tomcat的一切都正常,但在WebSphere上,我得到以下错误:
[SqlExceptionHelper] : SQL Error: 0, SQLState: null
[SqlExceptionHelper] : DSRA9010E: 'setReadOnly' wird in der WebSphere-Implementierung java.sql.Connection nicht unterstützt.
一些帖子说,甲骨文不支持只读。但是对于Propagation.SUPPORTS或Tomcat,它是有效的。
现在我不知道该怎么办。用Propagation.REQUIRED和readOnly=false标记JMS调用的所有方法
还有更好的主意吗?或者这是Spring在使用WebSphere时的一个bug?将错误翻译成英语,它说:
DSRA9010E: 'setReadOnly' is not supported in the WebSphere implementation java.sql.Connection
这不是一个bug,只是他们没有实现只读。如果使用连接池,这也是可以理解的,因为readonly通常是一个连接创建范围的属性
此外,readonly只是对jdbc提供者的一个建议:jdbc提供者可以忽略它,而据我所知,许多提供者并没有真正为它做任何事情
只是不要指定只读
要回答以下Sam评论:
Hibernate与该错误无关,是实现java.sql.Connection的Websphere组件在2003年6月之后将Websphere与Oracle一起使用时发出DSRA9010E错误,正如IBM自己明确解释的,IBM WebSphere Application Server java.sql.Connection实现不支持错误代码DSRA9010E和说明“setReadOnly”:
解决问题
2003年6月,对应用程序服务器代码进行了更改
缺陷168102。在2003年6月之前,setReadOnlytrue方法将
应用程序服务器中的内部标志,但未传达此信息
将信息发送到Oracle数据库。在2003年6月以后的版本中,
应用程序服务器如上所述发出错误
我对整篇文章的理解是,他们后来添加了该错误,以解决问题,作为缺陷168102的解决方案。为了清楚起见:让客户端知道设置该标志对底层数据库连接没有影响,因为Oracle不支持它
在文章的最后,他们建议将出现错误的版本升级到最新版本。是的,Oracle不支持只读,此提示将被忽略,可能您会损失更多的性能。您可以删除这些标志,相反,您可以将其设置为实体级别@Immutable。此注释只需要一点点,或者您可以更新实体字段@ColumnUpdateable=false,insertable=false 显示此新警告的是WebSphere8还是Hibernate4?我想知道,因为在Tomcat或Hibernate 3.6中,控制台中没有提示和警告。我更新了答案文本以回答您的评论。