概要
Cognos AnalyticsのSDKで、カスタム認証プロバイダーというCognos認証をJavaプログラムで行うサンプルがあります。※カスタム認証に関しては、以下参照。
Cognos カスタム認証のセットアップ手順
https://qiita.com/shinyama/items/1f9c7842a3966233a5d7
こちらのサンプルプログラムで、認証ソースのデータベースに接続が延々と増えてしまい、Db2のメモリーが大量に消費されてしまうという問題に最近いくつか遭遇しました。
あくまでこのプログラムはサンプルとして提供しているものなので、本番環境で使うのは自己責任だよ、という前提で提供されているものなのですが、実際使われているプロジェクトは多く、同じ問題に困っているプロジェクトも多いと思いますので投稿します。
対処
QueryUtil.javaプログラムのqueryImpl()で、以下の「<-追加」の箇所を追加して、statementとresultSetをクローズする事が必要です。
connectionに関しては、プログラム中で明示的にクローズすると認証エラーになるので、明示的なクローズは行いません。
しかしながら、不要になった接続は、Cognosの組み込みのWebSphere LibertyのGCのタイミングで解放されていきます。
try (final PreparedStatement statement = connection.prepareStatement(sql))
{
for (int i = 0; i < parameters.length; ++i)
statement.setObject(i + 1, parameters[i]);
try (final ResultSet resultSet = statement.executeQuery())
{
if (includeMetadata)
data.add(QueryUtil.getMetaDataRow(resultSet));
while (resultSet.next())
data.add(QueryUtil.getDataRow(resultSet));
resultSet.close(); <-追加
}
statement.close(); <-追加
}
catch (final SQLException ex)
{
throw new UnrecoverableException("SQL Exception", "An exception was caught while querying the authentication database.");
}
<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を使用される場合は、是非この記事を思い出してください。