与WebSphere和Oracle一起使用Propagation.SUPPORTS进行Spring ReadOnly事务

时间:2012-11-09 15:23:40

标签: java oracle spring hibernate websphere

我在事务/会话管理方面遇到了一些问题,因为我从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中的错误吗?

2 个答案:

答案 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)。