[ 
https://issues.apache.org/jira/browse/DERBY-4455?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12784180#action_12784180
 ] 

Brett Wooldridge commented on DERBY-4455:
-----------------------------------------

Kristian, if I could, I'd like to ask a few questions about your comments.  You 
said, " what happens is that Derby detects that the application connection has 
changed when it is about to execute the prepared statement", what exactly 
changed from Derby's perspective?  Then you said, "After preparing a new 
statement, it transfers the arguments that were set on the old statement to the 
new one"  Does this involve a "real" preparation of a statement?  And therefore 
does this behavior defeat the purpose of a PreparedStatement cache (either 
external or internal)?

With respect to the first question, is the "change" in the application 
connection that is detected by Derby a result of XA management?  Given that the 
statement cache is per-connection, and that the connection is re-used (in this 
case), why does Derby require a "re-prepare" and copy of arguments?

Thanks.

> 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.

Reply via email to