DBFlute: SQLのログ取得(CallbackContext)

@since 0.8.2
@target Java/C#

今更0.8.2にで入った機能を紹介します。
(抜けてました)

「例えば(WEBの)一回のリクエストで発行されたSQL文字列を全て取得」
というような要件に利用します。
取得してどうするかはアプリケーション次第ですが、
主な用途としては、「操作ログ」があるかと思います。

共通カラムで利用するAccessContextと同じように
PageクラスのInterceptorにて設置と破棄を行います。
[XxxInterceptor]

CallbackContext  context = new CallbackContext();
final List<String> sqlLogList = new ArrayList<String>();
context.setSqlLogHandler(new SqlLogHandler() {
    public void handle(String executedSql, String displaySql
                     , Object[] args, Class<?>[] argTypes) {
        sqlLogList.add(displaySql);
    }
});
try {
    CallbackContext.setCallbackContextOnThread(context);
    invocation.proceed();
} finally {
    CallbackContext.clearCallbackContextOnThread();
}
こうすることで、DBFluteの全てのSQLがhandle()メソッドで
キャッチすることが可能です。キャッチしたSQLを
どうするかはアプリケーション次第です。
上記の例では、リストに積んでいます。
「操作ログ」であれば、このリストの内容をDBにInsertしたり
することでしょう。

UT形式でのExample実装があります。
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-basic-example/src/test/java/com/example/dbflute/basic/dbflute/allcommon/CallbackContextTest.java

S2ContainerのSqlLogRegistryの代替機能にもなります。
CallbackContextは非常にシンプルな仕組みであるため、
わかりやすく、色々な用途に応用できるかと思います。