4.4.5 データベースとの接続処理の実装
データベースに接続するプラグインを開発する場合の条件を次に示します。
-
データソースを取得する処理は,プラグインの初期化処理(IPluginInitializerインタフェースのPluginInitializerクラス)で実装する。
-
データソースのルックアップ処理は,PluginInitializerクラスのinitメソッドで実装する。
次に,データベースに接続するプラグインを開発する場合に,推奨する実装を示します。
-
データソースの取得に失敗した場合は,UCNPPluginUserExceptionをスローする。
-
データソースの更新処理はinputFromNodeメソッドで実装する。
-
データソースの参照処理はoutputToNodeメソッドで実装する。
-
外部システムと連携するプラグインの場合,ほかのプラグインを使って更新と参照のタイミングを合わせる。
- 参考
-
データソースのルックアップ処理の失敗を無視してプラグインの起動処理を終了させると,ナビゲーション プラットフォームを再起動するまで次のルックアップ処理は実行されません。
ルックアップ処理失敗の要因は次のどちらかであるため,UCNPPluginUserExceptionをスローしてナビゲーション プラットフォームが起動しないようにしておく必要があります。
-
リソースアダプタが起動していない。
-
リソースアダプタの設定とプラグインの実装に不整合がある。
-
(1) プラグインの初期化処理の実装例
//inputFromNodeメソッドからデータソースを取得できるように,staticメンバ変数に格納する。
private static DataSource mDs;
@Override
public void init() throws UCNPPluginUserException {
try {
// データソースのルックアップ処理は,必ずinitメソッド内で行うこと。
InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup(
"java:comp/env/jdbc/TP_Connector_for_HiRDB_Type4");
mDs = ds;
} catch (NamingException e) {
// ルックアップ処理に失敗したら,UCNPPluginUserExceptionをスローすること。
UCNPPluginUserException ue = new UCNPPluginUserException(
"ルックアップ処理に失敗しました。", e);
throw ue;
}
}
public static DataSource getDataSource() {
return mDs;
}
(2) outputToNodeメソッドの実装例
public Map<String, Object> outputToNode(HttpSession session, Map<String, Object> param){
Map<String, Object> map = new HashMap<String, Object>();
DataSource ds = PluginInitializer.getDataSource(); // インスタンスを取得
Connection con = null;
PreparedStatement statement = null;
String name = null;
try {
// 接続を確立する
con = ds.getConnection();
// SQLを実行する
// 参照系の処理は,outputToNodeメソッドで行う
statement = con.prepareStatement("SELECT NAME FROM TP_TBL");
statement.setString(1, uid);
ResultSet set = statement.executeQuery();
// 結果を取得する
if (set.next()) {
name = set.getString(1);
}
Map<String, String> rtnParm = new HashMap<String, String>();
rtnParm.put("outputParam1", name);
map.put("ucnp.next.params.map ",rtnParm);
} catch (SQLException e) {
// エラー情報を応答に格納して,遷移を中断させる。
map.put("ucnp.error.message","DBアクセスでエラーが発生しました。");
map.put("ucnp.error.type","NG");
} finally {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
}
}
}
return name;
}