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.