Spring 有没有克服DSRA9010E的方法';setReadOnly';在WebSphere上不受支持;例外?
我们的应用程序使用Spring进行TX管理,并将某些事务标记为只读。在使用Oracle JDBC连接在websphere(8.5.5.3)上部署应用程序时,我们会遇到如下异常: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.
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的答案很好。