ORA-22990: LOB 定位符无法扩展事务处理

关于JDBC驱动的版本,您可以参考以下文档:
How To Determine The Exact JDBC Driver Version (9.x – 11.x) For Standalone Programs [ID 467804.1]

另外请您参考以下文档,该文档介绍了一种导致JDBC程序报告ORA-22990错误的场景:
ORA-22990: LOB Locators Cannot Span Transactions ( Doc ID 113666.1 )

The Oracle oracle.sql.BLOB OutputStream writes the data in chunks. Since autocommit defaults to true, the first chunk is committed. This results in the write operation for the next chunk of the Blob to fail since it appears to be in the next transaction.
In those conditions, the ORA-22990 exception will occur with any version of Oracle JDBC driver.

Oracle oracle.sql.BLOB OutputStream对象以分块(chunk)的方式写数据。因为autocommit参数默认是true,如果第一个chunk提交,会导致写下一个chunk失败,因为该操作已经走到了下一个事务。这种情况下JDBC驱动会报告ORA-2290。

该问题的解决方法是,在connection中开始设置setAutoCommit为false。在所有的chunck都写完后,最后调用stream.close()来进行提交。

您的代码中使用的是Clob,但是该文档也可能适用。您可以参考文档修改您的代码,在执行sql之前调用conn.setAutoCommit(false), 然后在数据全部完成之后调用writer.close()。

为了能继续分析此问题,请您提供以下信息:
1. JDBC驱动的具体版本,请您参考之前我们提供的文档检查JDBC驱动的版本。

2. ORA-22990发生的原因是由于transaction发生了变化。在另外一个文档中记录了由于在在事务进行过程中,物理连接的变化导致的ORA-22990。
在整个transaction开始到commit期间,jdbc使用的物理连接是不能变的。如果您使用了连接池,请您检查连接池是否有可能在事务执行期间更换物理连接。
例如WebLogic Server的连接池提供了KeepXAConnTillTxComplete参数来保证XA Transaction从始至终使用同一物理连接,来避免该问题。

 


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *