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

Simon Meng commented on DERBY-4224:
-----------------------------------

Thank you for quick response.
I read the document you provided. But I don't think my test program is same as 
the case described in the release notes. In my test case, execute one 
PreparedStatement caused another PreparedStatement can't work. The two 
PreparedDtatements use different Streams. They do not reference same Clob/Blob 
object.

Thanks,
Simon



> Got SQLException
> ----------------
>
>                 Key: DERBY-4224
>                 URL: https://issues.apache.org/jira/browse/DERBY-4224
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.4.2.0
>            Reporter: Simon Meng
>
> Got below error message when running a JDBC prolgram with derby. I use Apache 
> Derby Network Server - 10.4.2.0 - (689064). The same program works fine with 
> another version Apache Derby Network Server - 10.2.2.0 - (485682). It looks 
> like there is a regression between the two versions.
> Exception in thread "main" java.sql.SQLException: You cannot invoke other 
> java.sql.Clob/java.sql.Blob methods after calling the free() method or after 
> the Blob/Clob's transaction has been committed or rolled back.
>       at 
> org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown 
> Source)
>       at org.apache.derby.client.am.SqlException.getSQLException(Unknown 
> Source)
>       at org.apache.derby.client.am.Lob.checkValidity(Unknown Source)
>       at org.apache.derby.client.am.Clob.length(Unknown Source)
>       at 
> org.apache.derby.client.net.NetStatementRequest.computeProtocolTypesAndLengths(Unknown
>  Source)
>       at 
> org.apache.derby.client.net.NetStatementRequest.buildSQLDTAcommandData(Unknown
>  Source)
>       at org.apache.derby.client.net.NetStatementRequest.writeExecute(Unknown 
> Source)
>       at 
> org.apache.derby.client.net.NetPreparedStatement.writeExecute_(Unknown Source)
>       at org.apache.derby.client.am.PreparedStatement.writeExecute(Unknown 
> Source)
>       at org.apache.derby.client.am.PreparedStatement.flowExecute(Unknown 
> Source)
>       at org.apache.derby.client.am.PreparedStatement.executeX(Unknown Source)
>       at org.apache.derby.client.am.PreparedStatement.execute(Unknown Source)
>       at DerbyTest.test(DerbyTest.java:36)
>       at DerbyTest.main(DerbyTest.java:12)
> Caused by: org.apache.derby.client.am.SqlException: You cannot invoke other 
> java.sql.Clob/java.sql.Blob methods after calling the free() method or after 
> the Blob/Clob's transaction has been committed or rolled back.
>       ... 12 more
> Below is the test program I used.
> import java.io.ByteArrayInputStream;
> import java.io.IOException;
> import java.io.InputStream;
> import java.sql.Connection;
> import java.sql.DriverManager;
> import java.sql.PreparedStatement;
> import java.sql.SQLException;
> import java.sql.Statement;
> public class DerbyTest {
>     public static void main(String[] args) throws SQLException, IOException {
>         new DerbyTest().test();
>     }
>     private void test() throws SQLException, IOException {
>         Connection conn = null;
>         try {
>             conn = getConnection();
>             Statement stmt = conn.createStatement();
>             dropTable("test1");
>             dropTable("test2");
>             String createStr1 = "CREATE TABLE test1 (col0 VARCHAR(8000))";
>             String createStr2 = "CREATE TABLE test2 (col0 VARCHAR(8000))";
>             stmt.executeUpdate(createStr1);
>             stmt.executeUpdate(createStr2);
>             stmt.close();
>             
>             PreparedStatement pstmt1 = conn.prepareStatement("INSERT INTO 
> test1 VALUES (?)");
>             PreparedStatement pstmt2 = conn.prepareStatement("INSERT INTO 
> test1 VALUES (?)");
>             InputStream in1 = new 
> ByteArrayInputStream("abcdefghijklmnopqrstuvwxyz0123456789".getBytes());
>             InputStream in2 = new 
> ByteArrayInputStream("9876543210ZYXWVUTSRQPONMLKJIHGFEDCBA".getBytes());
>             pstmt1.setAsciiStream(1, in1, in1.available());
>             pstmt2.setAsciiStream(1, in2, in2.available());
>             pstmt1.execute();
>             pstmt2.execute();
>             pstmt1.close();
>             pstmt2.close();
>             System.out.println("Successful");
>         } finally {
>             if (conn != null)
>                 conn.close();
>         }
>     }
>     private Connection getDriverConnection() throws SQLException {
>         String connectionURL = 
> "jdbc:derby://localhost:1527/testdb;user=app;password=derby;create=true";
>         return DriverManager.getConnection(connectionURL);
>     }
>     private Connection getConnection() throws SQLException {
>         return getDriverConnection();
>     }
>     public void dropTable(String tableName) throws SQLException {
>               Connection conn = getConnection();
>               Statement stmt = conn.createStatement();
>               try {
>                       stmt.executeUpdate("DROP TABLE " + tableName);
>               } catch (SQLException sqle) {
>                       System.out.println("Error occured when drop table: " + 
> sqle.getMessage());
>               } finally {
>                       if (stmt != null) {
>                               stmt.close();
>                       }
>                       if (conn != null) {
>                               conn.close();
>                       }
>               }
>       }
> }

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