Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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
Spring 有没有克服DSRA9010E的方法';setReadOnly';在WebSphere上不受支持;例外?_Spring_Oracle_Transactions_Websphere - Fatal编程技术网

Spring 有没有克服DSRA9010E的方法';setReadOnly';在WebSphere上不受支持;例外?

Spring 有没有克服DSRA9010E的方法';setReadOnly';在WebSphere上不受支持;例外?,spring,oracle,transactions,websphere,Spring,Oracle,Transactions,Websphere,我们的应用程序使用Spring进行TX管理,并将某些事务标记为只读。在使用Oracle JDBC连接在websphere(8.5.5.3)上部署应用程序时,我们会遇到如下异常: Caused by: java.sql.SQLException: DSRA9010E: 'setReadOnly' is not supported on the WebSphere java.sql.Connection implementation. at com.ibm.ws.rsadapter.spi.

我们的应用程序使用Spring进行TX管理,并将某些事务标记为只读。在使用Oracle JDBC连接在websphere(8.5.5.3)上部署应用程序时,我们会遇到如下异常:

Caused by: java.sql.SQLException: DSRA9010E: 'setReadOnly' is not supported on the WebSphere java.sql.Connection implementation.
    at com.ibm.ws.rsadapter.spi.InternalOracleDataStoreHelper.setReadOnly(InternalOracleDataStoreHelper.java:371)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.setReadOnly(WSJdbcConnection.java:3646)
    at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.getTargetConnection(LazyConnectionDataSourceProxy.java:410)
    at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376)
    at com.sun.proxy.$Proxy476.getMetaData(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor40.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
    at java.lang.reflect.Method.invoke(Method.java:619)
    at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:239)
    at com.sun.proxy.$Proxy476.getMetaData(Unknown Source)
我知道websphere试图告诉我什么,但我想知道是否有办法禁用此检查,以便忽略Connection.setReadonly调用,而不是引发异常


当然,我也可以将应用程序更改为不使用只读事务,但这将更加复杂。

尝试像这样打开
连接
对象:

Context ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("jdbc/OracleDS");
Connection conn = ds.getConnection();

if (conn.isWrapperFor(oracle.jdbc.OracleConnection.class)) {
     // Returns an object that implements the given interface to
     // allow access to non-standard methods, or standard methods
     // not exposed by the proxy.
     oracle.jdbc.OracleConnection oraCon = conn.unwrap(oracle.jdbc.OracleConnection.class);
     // Do some Oracle-specific work here.
     oraCon.setReadOnly(readOnly);
     ....

}
conn.close(); 
请参阅Oracle JDBC(12c以后的版本;可能还有11g?)在使用readonly时可能会比较棘手- 根据:

使用12c驱动程序调用Connection.setReadOnly(true)不再建立只读事务

这意味着Spring(在版本4.3.7之前)也很难使用OracleJDBC设置只读事务(参见前面的链接)

要克服这个问题,您需要在SQL中手动包含
设置事务只读
,而不是依赖Spring的
@Transactional(readOnly=true)


但是,从Spring4.3.7开始,事务现在运行正常,因此您不应该再看到这个问题()

在我看来,这像是一个Websphere错误;有报道吗?我没有。我还没有使用更新的websphere版本(如8.5.5.5)对其进行测试。我们最终从spring应用程序上下文文件中删除了只读事务界限。+1删除了只读界限,正如Kai所回答的。这比打开连接更容易。不管怎样,Gas的答案很好。