Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring ReadOnly Transaction with Propagation.SUPPORTS with WebSphere和Oracle_Java_Oracle_Spring_Hibernate_Websphere - Fatal编程技术网

Java Spring ReadOnly Transaction with Propagation.SUPPORTS with WebSphere和Oracle

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

由于从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.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中,控制台中没有提示和警告。我更新了答案文本以回答您的评论。