db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kathey Marsden (JIRA)" <j...@apache.org>
Subject [jira] Created: (DERBY-4312) SQLException XJ215 on insert with setCharacterStream() and autocommit off in mailjdbc test
Date Fri, 17 Jul 2009 13:03:15 GMT
SQLException XJ215 on insert  with setCharacterStream() and autocommit off in mailjdbc test

                 Key: DERBY-4312
                 URL: https://issues.apache.org/jira/browse/DERBY-4312
             Project: Derby
          Issue Type: Bug
          Components: JDBC, Network Client
    Affects Versions:
         Environment: SuSE Linux IBM 1.6 SR4
            Reporter: Kathey Marsden

I am running the 10.5 maildbc test on Linux with network server and the release candidate
and an updated derbyTesting.jar to have just  Lily's change to change the backup user:  I
see in the test output early and often, this error inserting data into the table:

SQLState:   XJ215
Severity: 20000
Message:  You cannot invoke other java.sql.Clob/java.sql.Blob methods after calling the free()
method or after
Clob's transaction has been committed or rolled back.
java.sql.SQLException: You cannot invoke other java.sql.Clob/java.sql.Blob methods after calling
the free() m
ter 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
       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.executeUpdateX(Unknown Source)
       at org.apache.derby.client.am.PreparedStatement.executeUpdate(Unknown Source)
       at org.apache.derbyTesting.system.mailjdbc.utils.DbTasks.insertMail(DbTasks.java:447)
       at org.apache.derbyTesting.system.mailjdbc.tasks.Refresh.insertMail(Refresh.java:99)
       at org.apache.derbyTesting.system.mailjdbc.tasks.Refresh.doWork(Refresh.java:75)
       at org.apache.derbyTesting.system.mailjdbc.tasks.Refresh.run(Refresh.java:51)
Caused by: org.apache.derby.client.am.SqlException: You cannot invoke other java.sql.Clob/java.sql.Blob
lling the free() method or after the Blob/Clob's transaction has been committed or rolled

The interesting thing is that the test itself is not using any Clob methods it uses setCharacterStream
and also autocommit is off.
Below is a code excerpt and
           PreparedStatement insertFirst = conn.prepareStatement(
                   Statements.insertStr, Statement.RETURN_GENERATED_KEYS);
           String name = new String("ABCD");
           String l_name = new String("WXYZ");
           long s_insert = System.currentTimeMillis();
           for (int i = 0; i < num; i++) {
               String new_name = new String(increment(name, 60));
               String new_lname = new String(decrement(l_name, 60));
               insertFirst.setString(1, new_name);
               insertFirst.setString(2, new_lname);
               insertFirst.setTimestamp(3, new Timestamp(System
               name = new_name;
               l_name = new_lname;
               try {
                   // to create a stream of random length between 200 bytes and 3MB
                   int clobLength = Rn.nextInt(3078000 - 200 + 1) + 200;
                   streamReader = new LoopingAlphabetReader(clobLength,
                   insertFirst.setCharacterStream(4, streamReader, clobLength);
               } catch (Exception e) {
                   MailJdbc.logAct.logMsg(LogFile.ERROR + thread_name + " : "
                           + "File not found Exception : " + e.getMessage());
                   throw e;
               int rand_num = Rn.nextInt(10 - 1);
               if (i == rand_num) {
                   ResultSet rs = stmt
                           .executeQuery("select count(*) from REFRESH.INBOX where attach_id>0");
                   while (rs.next()) {
                       id_count = rs.getInt(1);
                       insertFirst.setInt(5, rs.getInt(1) + 1);

               } else
                   insertFirst.setInt(5, 0);
                               "This column is used only to by pass the space problem. If
the problem still exists, then we are going to "
                                       + "have a serious issue here.*****************************************************************************************************");
               int result = insertFirst.executeUpdate();

if I connect with ij I do see some rows in the INBOX, so some inserts do seem to be happening.

Kristian pointed out that this looks similar to DERBY-4224 with setAsciiStream() but this
looks far more  serious as autocommit is off and there does not appear to be a commit, so
there is no obvious workaround.  I assume this is also a regression.  We shouldn't be throwing
this error if the user did not use any Clob methods.   I will try to narrow down the reproduction
and track down where the issue was introduced. Knut said DERBY-4224 goes all the way back
to with DERBY-208.  I don't know if it is the same case with this one.

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message