3

我在 java Web 应用程序中使用 Hibernate 从 Oracle 11g 获取 CLOB 数据时收到“java.sql.SQLRecoverableException: Closed Connection”异常。对于数据库连接,我已经实现了 Tomcat 7 数据源。

以下是我得到异常的来源:

java.sql.Clob reqClob= userBean.getRequestData();
Reader clbReader = reqClob.getCharacterStream();

在上面的代码中执行“clob.getCharacterStream()”时,我遇到了异常:

java.sql.SQLRecoverableException: Closed Connection
at oracle.sql.CLOB.getDBAccess(CLOB.java:1389)
at oracle.sql.CLOB.getCharacterStream(CLOB.java:309)
at org.hibernate.lob.SerializableClob.getCharacterStream(SerializableClob.java:41)

请注意,我可以从 userBean 获取其他值的数据。

以下是我在应用程序中使用的应用程序版本:

jdk1.6.0_33 (64bit version)  
hibernate3.jar 
ojdbc6.jar 
Oracle 11g 11.2.0.1.0 - (64bit version)

一个奇怪的行为是,一旦我开始使用 TOMCAT 7 数据源,就会遇到这个问题。

下面是来自 Context.xml 的数据源代码:

<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" 
factory="oracle.jdbc.pool.OracleDataSourceFactory" name="jdbc/XXXX" password="XXXXX" 
type="oracle.jdbc.pool.OracleDataSource" 
url="jdbc:oracle:thin:@xx.xx.xx.xxxx:xxxx:xxxxxx" user="username"
connectionProperties="SetBigStringTryClob=true;" maxActive="20"
maxIdle="10" maxWait="-1" validationQuery="select 1 from dual" />

我已经在上面的代码中尝试了所有可能的参数,但是没有用。

提前感谢您的所有帮助,伙计们...

4

2 回答 2

2

我今天遇到了同样的问题,而且总是在我打电话getSubStringgetCharacterStream遇到关闭连接错误时。

我解决了注释并删除了 Clob 类型:

@Column(name = "CL_JSON_OUT", nullable = false)
private Clob jsonOut;

至:

@Lob
@Column(name = "CL_JSON_OUT", nullable = false)
private String jsonOut;

这篇文章帮助了我

于 2016-08-04T11:57:21.797 回答
1

I had similar problem, I changed Clob to String as below:

String clobAsString = clob.getSubString(1, (int)clob.length());

Make sure you perform this when the connection is alive. Like in DAO. This has to be performed within the transaction which retrieves Clob element from DB.

于 2013-10-08T22:06:42.200 回答