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 "Trejkaz (JIRA)" <ji...@apache.org> on 2017/01/11 01:05:58 UTC
[jira] [Created] (DERBY-6919) Exception from stream being inserted
renders PooledConnection unusable from that point onwards
Trejkaz created DERBY-6919:
------------------------------
Summary: Exception from stream being inserted renders PooledConnection unusable from that point onwards
Key: DERBY-6919
URL: https://issues.apache.org/jira/browse/DERBY-6919
Project: Derby
Issue Type: Bug
Components: JDBC
Affects Versions: 10.12.1.1, 10.13.1.1
Reporter: Trejkaz
The following test:
* Creates a pooled connection
* Gets a connection from it, tries to performs an insert which fails not due to the database at all, but due to the broken InputStream passed in
* Tries to get a new connection object to do new operations on.
The second call to get a new connection fails, but we don't think it should as it makes it difficult to reuse pooled connections.
{code}
@Test
public void testExceptionInsertingPoisonsPooledConnection() throws Exception
{
EmbeddedConnectionPoolDataSource dataSource = new EmbeddedConnectionPoolDataSource();
dataSource.setDatabaseName(temp.getRootPath().resolve("db").toString());
dataSource.setCreateDatabase("create");
PooledConnection pooledConnection = dataSource.getPooledConnection();
try {
// Someone initialising the db
try (Connection connection = pooledConnection.getConnection()) {
try (Statement statement = connection.createStatement()) {
statement.execute("CREATE TABLE blobs ( data BLOB(1G) )");
}
}
// Someone failing to insert something
try (Connection connection = pooledConnection.getConnection();
PreparedStatement statement = connection.prepareStatement("INSERT INTO blobs (data) VALUES (?)")) {
statement.setBinaryStream(1, new BrokenInputStream());
assertThat(statement::executeUpdate,
throwsException(SQLException.class));
}
// The next guy trying to do it right
try (Connection connection = pooledConnection.getConnection();
PreparedStatement statement = connection.prepareStatement("INSERT INTO blobs (data) VALUES (?)")) {
statement.setBinaryStream(1, new ByteArrayInputStream("data".getBytes(StandardCharsets.UTF_8)));
assertThat(statement.executeUpdate(), is(1));
}
} finally {
pooledConnection.close();
}
}
private static class BrokenInputStream extends InputStream {
@Override
public int read() throws IOException {
throw new NullPointerException("I forgot to check for null");
}
}
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)