sql >> Database >  >> RDS >> Oracle

Spring JDBC-verbindingspool en InputStream-resultaten

Helaas sloeg mijn fantasie op hol toen je deze vraag stelde. Ik weet niet of deze oplossing als eleganter wordt beschouwd. Deze klassen zijn echter eenvoudig en gemakkelijk opnieuw te gebruiken, dus u kunt ze misschien gebruiken als ze niet bevredigend zijn. Je zult zien dat alles aan het eind samenkomt...

public class BinaryCloseable implements Closeable {

    private Closeable first;
    private Closeable last;

    public BinaryCloseable(Closeable first, Closeable last) {
        this.first = first;
        this.last = last;
    }

    @Override
    public void close() throws IOException {
        try {
            first.close();
        } finally {
            last.close();
        }
    }

}

BinaryCloseable wordt gebruikt door CompositeCloseable :

public class CompositeCloseable implements Closeable {

    private Closeable target;

    public CompositeCloseable(Closeable... closeables) {
        target = new Closeable() { public void close(){} };
        for (Closeable closeable : closeables) {
            target = new BinaryCloseable(target, closeable);
        }
    }

    @Override
    public void close() throws IOException {
        target.close();
    }

}

De ResultSetCloser sluit ResultSet objecten:

public class ResultSetCloser implements Closeable {

    private ResultSet resultSet;

    public ResultSetCloser(ResultSet resultSet) {
        this.resultSet = resultSet;
    }

    @Override
    public void close() throws IOException {
        try {
            resultSet.close();
        } catch (SQLException e) {
            throw new IOException("Exception encountered while closing result set", e);
        }
    }

}

De PreparedStatementCloser sluit PreparedStatement objecten:

public class PreparedStatementCloser implements Closeable {

    private PreparedStatement preparedStatement;

    public PreparedStatementCloser(PreparedStatement preparedStatement) {
        this.preparedStatement = preparedStatement;
    }

    @Override
    public void close() throws IOException {
        try {
            preparedStatement.close();
        } catch (SQLException e) {
            throw new IOException("Exception encountered while closing prepared statement", e);
        }
    }

}

De ConnectionCloser sluit Connection objecten:

public class ConnectionCloser implements Closeable {

    private Connection connection;

    public ConnectionCloser(Connection connection) {
        this.connection = connection;
    }

    @Override
    public void close() throws IOException {
        try {
            connection.close();
        } catch (SQLException e) {
            throw new IOException("Exception encountered while closing connection", e);
        }
    }

}

We refactoren nu uw originele InputStream idee in:

public class ClosingInputStream extends InputStream {

    private InputStream stream;
    private Closeable closer;

    public ClosingInputStream(InputStream stream, Closeable closer) {
        this.stream = stream;
        this.closer = closer;
    }

    // The other InputStream methods...

    @Override
    public void close() throws IOException {
        closer.close();
    }

}

Uiteindelijk komt het allemaal samen als:

new ClosingInputStream(
        stream,
        new CompositeCloseable(
                stream,
                new ResultSetCloser(resultSet),
                new PreparedStatementCloser(statement),
                new ConnectionCloser(connection)
            )
    );

Wanneer deze ClosingInputStream 's close() methode wordt genoemd, is dit in feite wat er gebeurt (met uitzonderingsbehandeling weggelaten omwille van de duidelijkheid):

public void close() {
    try {
        try {
            try {
                try {
                    // This is empty due to the first line in `CompositeCloseable`'s constructor
                } finally {
                    stream.close();
                }
            } finally {
                resultSet.close();
            }
        } finally {
            preparedStatement.close();
        }
    } finally {
        connection.close();
    }
}

U bent nu vrij om zoveel Closeable . te sluiten objecten zoals je wilt.



  1. MySQL wait_timeout variabele - GLOBAL vs SESSION

  2. Nadat de login-knop is ingedrukt, hoe de waarde van Tkinter-invoer te verkrijgen en deze door te geven aan de SQL-query?

  3. Waarvoor dient de socketdeclaratie in Ruby on Rails database.yml?

  4. hoe maak je een inlogpagina in de Android-app?