Keith Yarbrough - 2014-09-22

Hi Paul,

Using ha-jdbc 3.0.3

I am unable to use setClob(Clob) against Postgres. Eventual error is: 'Stream closed'
issued by BufferedReader.

The culprit appears to be the SerialClob(Clob) call by the SerialClobFactory. The SerialClob(Clob) uses Java 7 auto-closure, so the characterStream is being closed by the time SerialClob(Clob) returns. This later on causes the 'Stream closed'.

Caused by: java.sql.SQLException: could not reset reader
at org.hibernate.engine.jdbc.ClobProxy.resetIfNeeded(ClobProxy.java:179) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.engine.jdbc.ClobProxy.getUnderlyingStream(ClobProxy.java:87) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.engine.jdbc.ClobProxy.getCharacterStream(ClobProxy.java:83) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.engine.jdbc.ClobProxy.getAsciiStream(ClobProxy.java:79) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.engine.jdbc.ClobProxy.invoke(ClobProxy.java:118) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at com.sun.proxy.$Proxy766.getAsciiStream(Unknown Source)
at javax.sql.rowset.serial.SerialClob.getAsciiStream(SerialClob.java:220) [rt.jar:1.7.0_67]
at org.postgresql.jdbc2.AbstractJdbc2Statement.setClob(AbstractJdbc2Statement.java:3180)
at sun.reflect.GeneratedMethodAccessor88.invoke(Unknown Source) [:1.7.0_67]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_67]
at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_67]
at net.sf.hajdbc.util.reflect.Methods.invoke(Methods.java:49)
at net.sf.hajdbc.invocation.SimpleInvoker.invoke(SimpleInvoker.java:53)
at net.sf.hajdbc.invocation.ExistingResultsCollector.collectResults(ExistingResultsCollector.java:47)
at net.sf.hajdbc.invocation.InvokeOnManyInvocationStrategy.invoke(InvokeOnManyInvocationStrategy.java:62)
at net.sf.hajdbc.invocation.InvocationStrategies.invoke(InvocationStrategies.java:35)
at net.sf.hajdbc.sql.AbstractInvocationHandler.invokeOnProxy(AbstractInvocationHandler.java:95)
at net.sf.hajdbc.sql.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:85)
at net.sf.hajdbc.sql.ChildInvocationHandler.invoke(ChildInvocationHandler.java:44)
at com.sun.proxy.$Proxy126.setClob(Unknown Source)
at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.setClob(WrappedPreparedStatement.java:1102)
at org.hibernate.type.descriptor.sql.ClobTypeDescriptor$3$1.doBind(ClobTypeDescriptor.java:116) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:90) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:56) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2843) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3121) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
... 184 more
Caused by: java.io.IOException: Stream closed
at java.io.StringReader.ensureOpen(StringReader.java:56) [rt.jar:1.7.0_67]
at java.io.StringReader.reset(StringReader.java:187) [rt.jar:1.7.0_67]
at org.hibernate.engine.jdbc.ClobProxy.resetIfNeeded(ClobProxy.java:175) [hibernate-core-4.3.5.Final.jar:4.3.5.Final]
... 211 more

I think things would be ok the reader in the Clob's CharaterStreamImpl was set to null after being closed. Because it would then just re-generate the Reader from the string. I don't see how this is possible.