1

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

这对我的使用 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.

一些帖子说,Oracle 不支持只读。但是使用 Propagation.SUPPORTS 或使用 Tomcat 它可以工作。现在我不知道该怎么办。用 Propagation.REQUIRED 和 readOnly = false 标记 JMS 调用的所有方法?

有更好的想法吗?或者这是使用 WebSphere 时 Spring 中的错误?

4

2 回答 2

0

用英文翻译错误它说:

DSRA9010E: 'setReadOnly' is not supported in the WebSphere implementation java.sql.Connection

这不是一个错误,只是他们没有实现只读。如果使用连接池,这也是可以理解的,因为只读通常是连接创建范围的属性。

此外 readonly 只是 jdbc 提供者的“建议”:jdbc 提供者可以忽略它,据我所知,许多提供者并没有真正为它做任何事情。

只是不要指定只读。


要回答下面的 Sam 评论:Hibernate 与该错误无关,它是实现java.sql.Connection的 Websphere 组件在 2003 年 6 月之后将 Websphere 与 Oracle 一起使用时发出DSRA9010E错误,正如IBM 本身在此处专门解释的那样代码 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 是不支持它。

在文章的结尾,他们建议升级到最新版本(发出错误的版本)。

于 2012-11-09T15:40:32.013 回答
0

是的,Oracle 不支持只读,这个提示将被忽略,也许你会失去更多的性能。您可以删除这些标志,而是可以将其设为实体级别 @Immutable(此注释需要一点注意),或者您可以更新实体字段 @column(updatable = false, insertable = false)。

于 2012-11-09T15:51:45.200 回答