我在事务/会话管理方面遇到了一些问题,因为我从Hibernate 3.6切换到了Hibernate 4.1.x
我使用的是Spring 3.1.2,Hibernate 4.1.4,WebSphere 8.5和Oracle 11。
在我的WebApp中,我标记了一些方法:
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
这适用于我的webapp,它使用OpenSessionInViewFilter和getSessionFactory()。getCurrentSession()。
但我的一些代码是由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)
现在有一个开放的Session,Tomcat的一切正常,但在WebSphere上我得到以下错误:
[SqlExceptionHelper] : SQL Error: 0, SQLState: null
[SqlExceptionHelper] : DSRA9010E: 'setReadOnly' wird in der WebSphere-Implementierung java.sql.Connection nicht unterstützt.
有些帖子说,甲骨文不支持readonly。但是使用Propagation.SUPPORTS或与Tomcat一起工作。 现在我不知道该怎么做。使用Propagation.REQUIRED和readOnly = false标记JMS调用的所有方法?
有更好的想法吗?或者这是使用WebSphere时的Spring中的错误吗?
答案 0 :(得分:0)
用英语翻译错误说:
DSRA9010E: 'setReadOnly' is not supported in the WebSphere implementation java.sql.Connection
这不是一个错误,只是他们没有实现只读。如果使用连接池,这也是可以理解的,因为readonly通常是连接创建范围属性。
此外,readonly只是jdbc提供者的“建议”:jdbc提供者可以忽略它,据我所知,许多提供者并没有真正为它做任何事情。
只是不要指定readonly。
回答下面的Sam评论:
Hibernate与该错误无关,实施 java.sql.Connection 的Websphere组件在2003年6月之后使用Websphere与Oracle时会发出 DSRA9010E 错误,正如所解释的那样IBM here专门针对错误代码DSRA9010E和描述"'setReadOnly' is not supported on the IBM WebSphere Application Server java.sql.Connection implementation"
:
解决问题
2003年6月,对Application Server代码进行了更改 缺省168102.在2003年6月之前,setReadOnly(true)方法设置了一个 Application Server中的内部标志,但未传达此信息 信息到Oracle数据库。在2003年6月以后的版本中, Application Server按上述方式发出错误。
我对整篇文章的理解是,为了清楚起见,他们在以后添加了该错误,以解决问题,作为缺陷168102的解决方案:让客户端知道设置该标志对底层数据库连接没有影响因为Oracle不支持它。
在文章的最后,他们建议升级到最新版本(发出错误的版本)。
答案 1 :(得分:0)
是的Oracle不支持只读,这个提示将被忽略,也许你会失去更多的性能。您可以删除这些标志,而不是将其设为实体级别@Immutable(此注释需要一点attention),或者您可以更新实体字段@column(updatable = false,insertable = false)。