Java
db2
SDK
Cognos
カスタム認証

Cognos SDK サンプルのカスタム認証プロバイダでDB接続数増大を防ぐ修正

概要

Cognos AnalyticsのSDKで、カスタム認証プロバイダーというCognos認証をJavaプログラムで行うサンプルがあります。※カスタム認証に関しては、以下参照。
Cognos カスタム認証のセットアップ手順
https://qiita.com/shinyama/items/1f9c7842a3966233a5d7

こちらのサンプルプログラムで、認証ソースのデータベースに接続が延々と増えてしまい、Db2のメモリーが大量に消費されてしまうという問題に最近いくつか遭遇しました。

あくまでこのプログラムはサンプルとして提供しているものなので、本番環境で使うのは自己責任だよ、という前提で提供されているものなのですが、実際使われているプロジェクトは多く、同じ問題に困っているプロジェクトも多いと思いますので投稿します。

対処

QueryUtil.javaプログラムのqueryImpl()で、以下の「<-追加」の箇所を追加して、statementとresultSetをクローズする事が必要です。
connectionに関しては、プログラム中で明示的にクローズすると認証エラーになるので、明示的なクローズは行いません。
しかしながら、不要になった接続は、Cognosの組み込みのWebSphere LibertyのGCのタイミングで解放されていきます。

        while (resultSet.next()) 
                    data.add(QueryUtil.getDataRow(resultSet)); 

        statement.close();   <-追加
        resultSet.close();   <-追加
                }
        } 
        catch (final SQLException ex) 
        { 
            throw new UnrecoverableException("SQL Exception", "An exception was caught while querying the authentication database."); 
        } 

        finally {  <-追加
                      try { if ( statement != null ) statement.close(); } catch ( Exception e ) {};  <-追加
                      try { if ( resultSet != null ) resultSet.close(); } catch ( Exception e) {}; <-追加
        }  <-追加

<2018/6/29 追記>
上記のSDKプログラムの修正に加えて、Cognos組み込みのWebSphere LibertyのGCポリシーを変更すると、より効率的なGCにより、DBセッションが大量に溜まる前に解放してくれることがわかりましたので追記しておきます。

GCの変更方法は、Linuxの場合以下のファイルの、
/opt/ibm/cognos/analytics/bin64/bootstrap_wlp_linuxi38664.xml

この箇所のgenconを変更してCognosを再起動します。
<param condName="${java_vendor}" condValue="IBM">-Xgcpolicy:gencon</param>

該当の事例では、「Balanced」に変更しました。
https://www.ibm.com/developerworks/jp/websphere/library/was/was8_gc/2.html

カスタム認証のRestorableJDBCSample及びJDBCSampleを使用される場合は、是非この記事を思い出してください。