I have a test case (below) where a long running db operation is
launched in a thread, and a separate thread invokes cancel() on the
executing Statement. The cancel() does not seem to have any effect,
and does not throw an exception in the calling thread or the statement
thread. The statement is in fact successfully committed to the db.
Is Statement.cancel() really supported by h2?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++
package persistence.perf;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class CancelCreateTest extends Thread {
protected PreparedStatement ps;
protected boolean createDone = false;
public void run() {
longCreate();
}
private void longCreate() {
System.out.println("" + System.currentTimeMillis() + " begin
create");
Connection conn = null;
try {
conn = getConnection();
conn.setAutoCommit(false);
ps = conn.prepareStatement("INSERT INTO RESOURCE (DATA)
VALUES(?)");
ps.setBytes(1, new byte[20000000]);
ps.executeUpdate();
conn.commit();
System.out.println("" + System.currentTimeMillis()
+ " committed create");
} catch (SQLException sqe) {
sqe.printStackTrace();
try {
conn.rollback();
System.out.println("" + System.currentTimeMillis()
+ " rolled back create");
} catch (SQLException sqe1) {
sqe1.printStackTrace();
}
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException sqe) {
sqe.printStackTrace();
}
createDone = true;
}
}
private int getNumRows() throws SQLException {
int count = -1;
Connection conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM RESOURCE");
if (rs.next()) {
count = rs.getInt(1);
}
conn.close();
return count;
}
private void setup() throws Exception {
Class.forName("org.h2.Driver");
Connection conn = getConnection();
Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE TABLE RESOURCE(DATA BLOB)");
stmt.close();
conn.close();
}
private void cleanup() throws SQLException {
Connection conn = getConnection();
Statement stmt = conn.createStatement();
stmt.executeUpdate("DROP TABLE RESOURCE");
stmt.close();
conn.close();
}
private Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:h2:db/test", "sa", "");
}
public static void main(String[] args) {
CancelCreateTest test = new CancelCreateTest();
try {
test.setup();
} catch (Exception e) {
e.printStackTrace();
}
test.start();
try {
Thread.sleep(300);
} catch (InterruptedException e) {
}
try {
test.ps.cancel();
System.out.println("" + System.currentTimeMillis()
+ " cancel complete");
} catch (SQLException sqe) {
sqe.printStackTrace();
}
while (!test.createDone) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
int numRows = -1;
try {
numRows = test.getNumRows();
} catch (SQLException sqe) {
sqe.printStackTrace();
}
System.out.println("" + System.currentTimeMillis() + " " + numRows
+ " rows found");
try {
test.cleanup();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++
output:
1320285691079 begin create
1320285691379 cancel complete
1320285691603 committed create
1320285692801 1 rows found
--
You received this message because you are subscribed to the Google Groups "H2
Database" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/h2-database?hl=en.