Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Pula połączeń Spring JDBC i wyniki InputStream

Niestety, moja wyobraźnia oszalała, gdy zadałeś to pytanie. Nie wiem, czy to rozwiązanie uważa się za bardziej eleganckie. Jednak te klasy są proste i łatwe do ponownego użycia, więc możesz znaleźć dla nich zastosowanie, jeśli nie są satysfakcjonujące. Zobaczysz, jak wszystko się układa na końcu...

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 jest używany przez 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();
    }

}

ResultSetCloser zamyka ResultSet obiekty:

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);
        }
    }

}

PreparedStatementCloser zamyka PreparedStatement obiekty:

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);
        }
    }

}

ConnectionCloser zamyka Connection obiekty:

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);
        }
    }

}

Refaktorujemy teraz Twój oryginalny InputStream pomysł na:

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();
    }

}

Wreszcie wszystko składa się na:

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

Kiedy ten ClosingInputStream close() wywoływana jest metoda, faktycznie tak się dzieje (z pominięciem obsługi wyjątków dla jasności):

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();
    }
}

Możesz teraz zamknąć jak najwięcej Closeable obiekty, jak chcesz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiedy należy używać procedur składowanych w języku Java z bazą danych Oracle… jakie są wady?

  2. Oracle PL/SQL:Pomóż w rozwiązaniu PLS-00103:Napotkano symbol LOOP, oczekując jednej z następujących sytuacji:jeśli

  3. Jak rozwiązywać problemy z ORA-02049 i ogólnie blokować problemy z Oracle?

  4. Obsługa wyjątków ORACLE

  5. Zrozumienie wyników Execute Explain Plan w Oracle SQL Developer