[
https://issues.apache.org/jira/browse/DERBY-4455?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12790725#action_12790725
]
Brett Wooldridge commented on DERBY-4455:
-----------------------------------------
I consider this bug fixed by the provided patch. Therefore you are free to
close the issue.
However, if there is indeed *unnecessary* server-side "re-preparation" of the
statements (see
org.apache.derby.impl.jdbc.EmbedPreparedStatement.transferParameters in the
stack trace) in the case of XA connections, I would like a separate issue to be
opened. Other than that efficiency concern, the actual defect appears to be
fixed by the patch and I have not encountered this exception since applying the
patch.
I would like to see this fix integrated into the next release because I prefer
not to run non-released versions of jars.
> Prepared statement failure with CLOB: Stream has already been read and
> end-of-file reached and cannot be re-used.
> -----------------------------------------------------------------------------------------------------------------
>
> Key: DERBY-4455
> URL: https://issues.apache.org/jira/browse/DERBY-4455
> Project: Derby
> Issue Type: Bug
> Components: Network Server
> Affects Versions: 10.5.3.0
> Environment: Mac OS X 10.6.2, Java 6, Bitronix JTA
> Reporter: Brett Wooldridge
> Attachments: derby-4455-1a.diff, derby-4455-1b.diff, DerbyFailure.zip
>
>
> Possibly related to #4332?
> We have encountered an error when using Prepared Statements and CLOBs. I
> have read:
> http://db.apache.org/derby/papers/JDBCImplementation.html#setAsciiStream%2CsetBinaryStream%2CsetCharacterStream
> But it does not seem applicable, as we are not re-using a stream.
> The environment is this:
> 1. Java 6
> 2. Derby 10.5.3.0
> 3. Bitronix JTA 1.3.3
> We're actually using Hibernate, but I eliminated it from the equation (and
> the problem persists).
> A summary of the failure flow is this:
> 1. Start a transaction
> 2. Obtain a connection from a pool of connections (for this test, the pool
> size is pinned at 1)
> 3. Prepare a statement that inserts a CLOB.
> 4. Set the parameters
> 5. Add the prepared statement to a batch (but we only batch 1 -- this is to
> emulate what hibernate is doing as closely as possible).
> 6. Execute the batch.
> Everything up to this point works.
> 7. Repeat steps 1-6. But this time, the connection will be reused from the
> pool, and the statement will be gotten from a prepared statement cache
> (maintained by bitronix). I.e. the prepared statement is re-used.
> 8. Observe the following failure:
> org.apache.derby.client.am.BatchUpdateException: Non-atomic batch failure.
> The batch was submitted, but at least one exception occurred on an individual
> member of the batch. Use getNextException() to retrieve the exceptions for
> specific batched elements.
> at org.apache.derby.client.am.Agent.endBatchedReadChain(Unknown Source)
> at
> org.apache.derby.client.am.PreparedStatement.executeBatchRequestX(Unknown
> Source)
> at org.apache.derby.client.am.PreparedStatement.executeBatchX(Unknown
> Source)
> at org.apache.derby.client.am.PreparedStatement.executeBatch(Unknown
> Source)
> at
> bitronix.tm.resource.jdbc.JdbcPreparedStatementHandle.executeBatch(JdbcPreparedStatementHandle.java:248)
> at org.dancernetworks.TestFailure.doInsert(TestFailure.java:134)
> at org.dancernetworks.TestFailure.doPrepared(TestFailure.java:110)
> at org.dancernetworks.TestFailure.main(TestFailure.java:55)
> Nov 30, 2009 10:29:31 PM bitronix.tm.BitronixTransactionManager shutdown
> INFO: shutting down Bitronix Transaction Manager
> An IOException was thrown when reading a 'java.sql.String' from an
> InputStream.
> java.sql.SQLException: An IOException was thrown when reading a
> 'java.sql.String' from an InputStream.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown
> Source)
> at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
> at org.apache.derby.impl.jdbc.Util.seeNextException(Unknown Source)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown
> Source)
> at
> org.apache.derby.impl.jdbc.EmbedResultSet.noStateChangeException(Unknown
> Source)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.transferParameters(Unknown
> Source)
> at
> org.apache.derby.jdbc.XAStatementControl.getRealPreparedStatement(Unknown
> Source)
> at
> org.apache.derby.iapi.jdbc.BrokeredPreparedStatement.getPreparedStatement(Unknown
> Source)
> at
> org.apache.derby.iapi.jdbc.BrokeredPreparedStatement.getStatement(Unknown
> Source)
> at org.apache.derby.iapi.jdbc.BrokeredStatement.close(Unknown Source)
> at org.apache.derby.impl.drda.DRDAStatement.close(Unknown Source)
> at org.apache.derby.impl.drda.Database.close(Unknown Source)
> at org.apache.derby.impl.drda.Session.close(Unknown Source)
> at org.apache.derby.impl.drda.DRDAConnThread.closeSession(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)
> Caused by: java.sql.SQLException: An IOException was thrown when reading a
> 'java.sql.String' from an InputStream.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
> Source)
> ... 15 more
> Caused by: java.sql.SQLException: Java exception: 'Stream has already been
> read and end-of-file reached and cannot be re-used.: java.io.EOFException'.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
> Source)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown
> Source)
> at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
> at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown
> Source)
> ... 12 more
> Caused by: java.io.EOFException: Stream has already been read and end-of-file
> reached and cannot be re-used.
> at org.apache.derby.iapi.types.ReaderToUTF8Stream.read(Unknown Source)
> at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:320)
> at org.apache.derby.iapi.types.SQLChar.readExternal(Unknown Source)
> at org.apache.derby.iapi.types.SQLChar.getString(Unknown Source)
> at org.apache.derby.iapi.types.SQLChar.setFrom(Unknown Source)
> at org.apache.derby.iapi.types.DataType.setValue(Unknown Source)
> at
> org.apache.derby.impl.sql.GenericParameterValueSet.transferDataValues(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.BaseActivation.setParameters(Unknown Source)
> at
> org.apache.derby.impl.sql.GenericActivationHolder.setParameters(Unknown
> Source)
> ... 10 more
> Attached is an archived Eclipse project of a self-contained reproduction. It
> includes everything needed to run, including the Bitronix 1.3.3 jar.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.