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)

Reply via email to