sql >> データベース >  >> RDS >> Oracle

SpringJDBC接続プールとInputStreamの結果

    残念ながら、あなたがこの質問をしたとき、私の想像力は狂ったようになりました。このソリューションがよりエレガントであると考えられるかどうかはわかりません。ただし、これらのクラスは単純で簡単に再利用できるため、満足のいくものでない場合は、これらのクラスを使用できる可能性があります。最後にすべてが一緒になっているのがわかります...

    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 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 ResultSetを閉じます オブジェクト:

    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 PreparedStatementを閉じます オブジェクト:

    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 Connectionを閉じます オブジェクト:

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

    元のInputStreamをリファクタリングします アイデア:

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

    最後に、すべてが次のようにまとめられます。

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

    このClosingInputStreamclose() メソッドが呼び出されると、これが事実上発生します(わかりやすくするために例外処理は省略されています):

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

    これで、Closeableをいくつでも自由に閉じることができます。 好きなようにオブジェクト。



    1. SQLite RealvalsをJavaBigDecimal値に書き込むにはどうすればよいですか?

    2. GRANTがMySQLで機能しないのはなぜですか?

    3. トランザクションに含める必要のあるDDLステートメントの単体テスト

    4. MSSQLスクリプトをMysqlとOracleに変換します