You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Rick Hillegas (JIRA)" <ji...@apache.org> on 2010/04/20 15:24:50 UTC

[jira] Updated: (DERBY-4312) SQLException XJ215 on insert with setCharacterStream() and autocommit off in mailjdbc test

     [ https://issues.apache.org/jira/browse/DERBY-4312?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Rick Hillegas updated DERBY-4312:
---------------------------------

    Attachment: releaseNote.html

Shortened the summary line in the release note in order to make the 10.6 release notes more readable.

> 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: 10.4.2.0, 10.5.1.1, 10.5.2.0, 10.6.0.0
>         Environment: SuSE Linux IBM 1.6 SR4
>            Reporter: Kathey Marsden
>            Assignee: Kathey Marsden
>             Fix For: 10.4.2.1, 10.5.3.0, 10.6.0.0
>
>         Attachments: create.sql, derby-4312_diff.txt, derby-4312_diff.txt, releaseNote.html, releaseNote.html, ReproDerby4312.java
>
>
> I am running the 10.5 maildbc test on Linux with network server and the 10.5.2.0 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 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.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 metho
> lling the free() method or after the Blob/Clob's transaction has been committed or rolled back.
> 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
>        conn.setAutoCommit(false);
>            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
>                        .currentTimeMillis()));
>                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,
>                            CharAlphabet.modernLatinLowercase());
>                    insertFirst.setCharacterStream(4, streamReader, clobLength);
>                } catch (Exception e) {
>                    MailJdbc.logAct.logMsg(LogFile.ERROR + thread_name + " : "
>                            + "File not found Exception : " + e.getMessage());
>                    errorPrint(e);
>                    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);
>                    }
>                    rs.close();
>                    conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
>                } else
>                    insertFirst.setInt(5, 0);
>                insertFirst
>                        .setString(
>                                6,
>                                "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 10.3.1.4 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.