The following test fails on H2 but works on Derby:
public static void main(String args[]) throws Exception {
Connection conn =
DriverManager.getConnection("jdbc:derby:test;create=true");
//Connection conn =
DriverManager.getConnection("jdbc:h2:tcp://localhost/mem:test", "sa", "");
conn.createStatement().executeUpdate("drop table ITEM");
//conn.createStatement().executeUpdate("drop table if exists ITEM");
conn.createStatement().executeUpdate("create table ITEM (FOO blob)");
conn.setAutoCommit(false);
// INSERT
PreparedStatement statement = conn.prepareStatement("insert into ITEM (FOO)
values (?)");
byte[] bytes = new byte[131072];
new Random().nextBytes(bytes);
statement.setBinaryStream(1, new ByteArrayInputStream(bytes));
int result = statement.executeUpdate();
assert result == 1;
statement.close();
conn.commit();
// SELECT
ResultSet rs = conn.createStatement().executeQuery("select * from ITEM");
Blob blob = null;
while(rs.next()) {
blob = rs.getBlob(1);
// Works
//assert blob != null;
//bytes = blob.getBytes(1, (int)blob.length());
//assert bytes.length == 131072;
}
// Failure A
//assert blob != null;
//bytes = blob.getBytes(1, (int)blob.length());
//assert bytes.length == 131072;
rs.close();
// Failure B
//assert blob != null;
//bytes = blob.getBytes(1, (int)blob.length());
//assert bytes.length == 131072;
conn.commit();
// Failure C
//assert blob != null;
//bytes = blob.getBytes(1, (int)blob.length());
//assert bytes.length == 131072;
conn.close();
}
Expected is that Failure A and B pass, as they do on Derby. H2 seems to
restrict the validity of the blob to the iteration of the ResultSet, not even
the open/close status of the ResultSet. It should use the transaction scope.
--
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.