@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は非常にシンプルな仕組みであるため、 わかりやすく、色々な用途に応用できるかと思います。