コネクションのIDを割り振ってMDCにputする

本番でのご使用はご注意ください。 あとJDBCドライバ固定のコードになっているので注意してください。

タイトル通りなんですがコネクションのIDを割り振ってMDCにputするコードを書いたので ここに書いておきます。

なぜこんな物を書いたかというと コネクションがどういうライフサイクルで使い回されているのかをトラッキングするためです。

基本的にはDataSourceとConnectionの移譲をするだけです。 なので以下のようなコードになりました。

   private static class MDCClearConnection implements Connection {

        private final Connection delegate;

        MDCClearConnection(Connection connection) {
            this.delegate = connection;
        }

        @Override
        public void close() throws SQLException {
            try {
                delegate.close();
            } finally {
                MDC.remove("connectionid");
            }
        }

        // その他のメソッドはdelegateに移譲する

    }

    private static class MDCInsertingDataSource implements DataSource {

        private final Map<Connection, String> map = Collections.synchronizedMap(new WeakHashMap<>());

        private final DataSource delegate;

        public MDCInsertingDataSource(DataSource delegate) {
            this.delegate = delegate;
        }

        @Override
        public Connection getConnection() throws SQLException {
            Connection connection = delegate.getConnection();
            PgConnection real = connection.unwrap(PgConnection.class);
            MDC.put("connectionid" , map.computeIfAbsent(real, c -> UUID.randomUUID().toString()));
            return new MDCClearConnection(connection);
        }

        @Override
        public Connection getConnection(String username, String password) throws SQLException {
            Connection connection = delegate.getConnection(username, password);
            PgConnection real = connection.unwrap(PgConnection.class);
            MDC.put("connectionid" , map.computeIfAbsent(real, c -> UUID.randomUUID().toString()));
            return new MDCClearConnection(connection);
        }

        // その他のメソッドはdelegateに移譲する
    }

テストは雑にapache benchで実行します。

ab -c 10 -n 1000 http://localhost:8080/test

出てきたログから connectionidだけ拾ってきたのが下です。

{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"ce833ce3-ffcd-4ee8-bfc7-48813e5a893b"}
{"connectionid":"ce833ce3-ffcd-4ee8-bfc7-48813e5a893b"}
{"connectionid":"6cd35dd2-8460-4a37-bec3-0703e2db1096"}
{"connectionid":"e412de40-1dbc-4b1d-b0d1-6755e63479c6"}
{"connectionid":"e412de40-1dbc-4b1d-b0d1-6755e63479c6"}
{"connectionid":"6cd35dd2-8460-4a37-bec3-0703e2db1096"}
{"connectionid":"35636255-3622-4285-85d2-be28ce88fea7"}
{"connectionid":"35636255-3622-4285-85d2-be28ce88fea7"}
{"connectionid":null}
{"connectionid":"7ed73e68-4463-48f2-9d6b-63d215ab3cbb"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"7ed73e68-4463-48f2-9d6b-63d215ab3cbb"}
{"connectionid":"7ed73e68-4463-48f2-9d6b-63d215ab3cbb"}
{"connectionid":"66e71593-cfd0-447a-bcc8-2fc75993bb41"}
{"connectionid":"66e71593-cfd0-447a-bcc8-2fc75993bb41"}
{"connectionid":"7ed73e68-4463-48f2-9d6b-63d215ab3cbb"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"8673df86-29e0-4088-8fe2-4b11a260835e"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"35636255-3622-4285-85d2-be28ce88fea7"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"6cd35dd2-8460-4a37-bec3-0703e2db1096"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"7ed73e68-4463-48f2-9d6b-63d215ab3cbb"}
{"connectionid":"7ed73e68-4463-48f2-9d6b-63d215ab3cbb"}
{"connectionid":null}
{"connectionid":"ce833ce3-ffcd-4ee8-bfc7-48813e5a893b"}
{"connectionid":null}
{"connectionid":"6cd35dd2-8460-4a37-bec3-0703e2db1096"}
{"connectionid":"6cd35dd2-8460-4a37-bec3-0703e2db1096"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"e412de40-1dbc-4b1d-b0d1-6755e63479c6"}
{"connectionid":null}
{"connectionid":"877ac0ee-5870-4644-adc2-aea6c315175e"}
{"connectionid":"877ac0ee-5870-4644-adc2-aea6c315175e"}
{"connectionid":"66e71593-cfd0-447a-bcc8-2fc75993bb41"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"e412de40-1dbc-4b1d-b0d1-6755e63479c6"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"877ac0ee-5870-4644-adc2-aea6c315175e"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"e412de40-1dbc-4b1d-b0d1-6755e63479c6"}
{"connectionid":"6cd35dd2-8460-4a37-bec3-0703e2db1096"}
{"connectionid":null}
{"connectionid":"7ed73e68-4463-48f2-9d6b-63d215ab3cbb"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"e412de40-1dbc-4b1d-b0d1-6755e63479c6"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"d68f556d-3017-4992-9bf0-f601605cc307"}
{"connectionid":"d68f556d-3017-4992-9bf0-f601605cc307"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"1eac0f30-25c8-468c-8216-d218a9b23405"}
{"connectionid":null}
{"connectionid":"1eac0f30-25c8-468c-8216-d218a9b23405"}
{"connectionid":"6cd35dd2-8460-4a37-bec3-0703e2db1096"}
{"connectionid":"6cd35dd2-8460-4a37-bec3-0703e2db1096"}
{"connectionid":"877ac0ee-5870-4644-adc2-aea6c315175e"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"66e71593-cfd0-447a-bcc8-2fc75993bb41"}
{"connectionid":"66e71593-cfd0-447a-bcc8-2fc75993bb41"}
{"connectionid":null}
{"connectionid":"877ac0ee-5870-4644-adc2-aea6c315175e"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"7ed73e68-4463-48f2-9d6b-63d215ab3cbb"}
{"connectionid":"7ed73e68-4463-48f2-9d6b-63d215ab3cbb"}
{"connectionid":"d68f556d-3017-4992-9bf0-f601605cc307"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"66e71593-cfd0-447a-bcc8-2fc75993bb41"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"1eac0f30-25c8-468c-8216-d218a9b23405"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"e412de40-1dbc-4b1d-b0d1-6755e63479c6"}
{"connectionid":"e412de40-1dbc-4b1d-b0d1-6755e63479c6"}
{"connectionid":"7ed73e68-4463-48f2-9d6b-63d215ab3cbb"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"e412de40-1dbc-4b1d-b0d1-6755e63479c6"}
{"connectionid":null}
{"connectionid":null}
{"connectionid":"877ac0ee-5870-4644-adc2-aea6c315175e"}
{"connectionid":null}

ちゃんと動いてそうですね。 実際はConnectionが生成されたり破棄されたりした時のイベントの方が知りたいかもしれません。 FlexyPoolとか使えば取れそうです。というところまで調べた。

この記事はここで終わりです。