我得到“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" />
我在上面的代码中尝试了所有可能的参数,但它没有用。
提前感谢您的帮助,伙计......
答案 0 :(得分:1)
我今天遇到了同样的问题,而且当我打电话给getSubString
或getCharacterStream
时,我遇到了闭合连接错误。
我用注释解决了并删除了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元素的事务中执行。