Return-Path: Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: (qmail 28703 invoked from network); 15 Jan 2010 13:50:18 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 15 Jan 2010 13:50:18 -0000 Received: (qmail 74782 invoked by uid 500); 15 Jan 2010 13:50:18 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 74744 invoked by uid 500); 15 Jan 2010 13:50:18 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 74736 invoked by uid 99); 15 Jan 2010 13:50:18 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 15 Jan 2010 13:50:18 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.140] (HELO brutus.apache.org) (140.211.11.140) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 15 Jan 2010 13:50:15 +0000 Received: from brutus.apache.org (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id 88337234C4AD for ; Fri, 15 Jan 2010 05:49:54 -0800 (PST) Message-ID: <453988145.263501263563394556.JavaMail.jira@brutus.apache.org> Date: Fri, 15 Jan 2010 13:49:54 +0000 (UTC) From: "Kristian Waagan (JIRA)" To: derby-dev@db.apache.org Subject: [jira] Commented: (DERBY-4455) Prepared statement failure with CLOB: Stream has already been read and end-of-file reached and cannot be re-used. In-Reply-To: <527960134.1259589320629.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/DERBY-4455?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12800701#action_12800701 ] Kristian Waagan commented on DERBY-4455: ---------------------------------------- I logged DERBY-4515 to clarify the usage of the length argument (a patch is awaiting review). Regarding your concern about the top-level JDBC length parameter(s) getting lost, I think setValue(InputStream,int) is a way we can pass the information on. This is currently done for binary types, but not for the character types. In the latter case, there is another mechanism (CharacterStreamDescriptor) used to achieve the same effect - at least for Clobs where it may really matter. After DERBY-4515 has been resolved, a small change has to be made to the patch attached this issue. I will then commit it and backport it to 10.5. > 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 > Assignee: Kristian Waagan > 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.