使用Hibernate + oracle 11g获取CLOB数据时的java.sql.SQLRecoverableException

时间:2013-04-27 06:51:07

标签: hibernate oracle11g java-6 clob

我得到“java.sql.SQLRecoverableException:Closed Connection”,在java Web应用程序中使用Hibernate从Oracle 11g获取CLOB数据时出现异常。对于数据库连接,我实现了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" />

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

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

2 个答案:

答案 0 :(得分:1)

我今天遇到了同样的问题,而且当我打电话给getSubStringgetCharacterStream时,我遇到了闭合连接错误。

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

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

为:

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

This post帮助了我

答案 1 :(得分:0)

我有类似的问题,我将Clob改为String,如下所示:

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

确保在连接处于活动状态时执行此操作。就像DAO一样。 这必须在从DB中检索Clob元素的事务中执行。