|
I had a quick look at this, and to me it looks like the same stream is being used as input twice. This causes a failure the second time around, i.e. when the UPDATE statement is being used. With the development version of Derby (trunk), from derby.log:
Wed Jul 17 21:16:31 CEST 2013 Thread[Thread-2,5,main] (XID = 209), (SESSIONID = 1), (DATABASE = target/test), (DRDAID = null), End compiling prepared statement: update lob_test set lobValue=?, qwerty=? where id=? :End prepared statement Exception trace: ERROR XCL30: An IOException was thrown when reading a 'BLOB' from an InputStream. at org.apache.derby.iapi.error.StandardException.newException(StandardException.java:265) at org.apache.derby.iapi.types.SQLBinary.throwStreamingIOException(SQLBinary.java:307) at org.apache.derby.iapi.types.SQLBinary.getValue(SQLBinary.java:257) at org.apache.derby.iapi.types.SQLBinary.getBytes(SQLBinary.java:226) at org.apache.derby.iapi.types.SQLBlob.cloneValue(SQLBlob.java:135) at org.apache.derby.impl.sql.GenericParameter.getClone(GenericParameter.java:129) at org.apache.derby.impl.sql.GenericParameterValueSet.<init>(GenericParameterValueSet.java:86) at org.apache.derby.impl.sql.GenericParameterValueSet.getClone(GenericParameterValueSet.java:328) at org.apache.derby.impl.jdbc.EmbedPreparedStatement.addBatch(EmbedPreparedStatement.java:1061) at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.addToBatch(BatchingBatch.java:76) at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3224) at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3126) at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3456) at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:287) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404) at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) at DerbyLobTest.hibernateTest(DerbyLobTest.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:491) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.hibernate.testing.junit4.ExtendedFrameworkMethod.invokeExplosively(ExtendedFrameworkMethod.java:63) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) at org.junit.internal.runners.statements.FailOnTimeout$StatementThread.run(FailOnTimeout.java:62) Caused by: org.apache.derby.iapi.services.io.DerbyIOException: Input stream did not have exact amount of data as the requested length. at org.apache.derby.iapi.types.RawToBinaryFormatStream.checkSufficientData(RawToBinaryFormatStream.java:207) at org.apache.derby.iapi.types.RawToBinaryFormatStream.read(RawToBinaryFormatStream.java:280) at java.io.DataInputStream.readFully(DataInputStream.java:195) at java.io.DataInputStream.readFully(DataInputStream.java:169) at org.apache.derby.iapi.types.SQLBinary.readExternal(SQLBinary.java:425) at org.apache.derby.iapi.types.SQLBinary.getValue(SQLBinary.java:247) ... 33 more
, and with a debug/sane build:
org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED Unexpected exception at org.apache.derby.iapi.types.RawToBinaryFormatStream.checkSufficientData(RawToBinaryFormatStream.java:207) at org.apache.derby.iapi.types.RawToBinaryFormatStream.read(RawToBinaryFormatStream.java:280) at java.io.DataInputStream.readFully(DataInputStream.java:195) at java.io.DataInputStream.readFully(DataInputStream.java:169) at org.apache.derby.iapi.types.SQLBinary.readExternal(SQLBinary.java:425) at org.apache.derby.iapi.types.SQLBinary.getValue(SQLBinary.java:247) at org.apache.derby.iapi.types.SQLBinary.getBytes(SQLBinary.java:226) at org.apache.derby.iapi.types.SQLBlob.cloneValue(SQLBlob.java:135) at org.apache.derby.impl.sql.GenericParameter.getClone(GenericParameter.java:129) at org.apache.derby.impl.sql.GenericParameterValueSet.<init>(GenericParameterValueSet.java:86) at org.apache.derby.impl.sql.GenericParameterValueSet.getClone(GenericParameterValueSet.java:328) at org.apache.derby.impl.jdbc.EmbedPreparedStatement.addBatch(EmbedPreparedStatement.java:1061) at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.addToBatch(BatchingBatch.java:76) at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3224) at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3126) at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3456) at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:287) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404) at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) at DerbyLobTest.hibernateTest(DerbyLobTest.java:39)
The stream is an instance of org.hibernate.engine.jdbc.internal.BinaryStreamImpl (created from BlobProxy), and some custom logging shows that the same instance is being used twice. I have not dug deeper, i.e. to confirm if reset() is being called to rewind the stream or if the same stream object is supposed to be used twice etc.
|