JavaアプリケーションからOracle DBに特定のものを記録するために、次のアプローチをとっています。
Package com.util.dblog;
public class DBLog {
static Connection con = null;
static PreparedStatement stmt = null;
static {
try{
DBConnectionHelper connHelper = DBConnectionHelper.createInstance();
con=connHelper.getConnection("ds"); //Getting connection from connection pool
con.setAutoCommit(false);
}
catch(Exception e)
{}
}
public static void logmethod1(String param1, String param2) {
if (con == null || con.isClosed()) {
DBConnectionHelper connHelper = DBConnectionHelper.createInstance();
con=connHelper.getConnection("ds");
con.setAutoCommit(false);
}
String SQL_PREP_INSERT = "INSERT INTO tableA (LOG_ID,USER_ID,EXEC_TIME) VALUES" + " (logid_seq.nextval, ?, ?)";
stmt = con.prepareStatement(SQL_PREP_INSERT);
stmt.execute();
stmt.close();
}
public static void logmethod2(String param1, String param2, String param3) {
if (con == null || con.isClosed()) {
DBConnectionHelper connHelper = DBConnectionHelper.createInstance();
con=connHelper.getConnection("ds");
con.setAutoCommit(false);
}
...
...
}
public saveCon() {
con.commit();
}
public closeCon() {
con.close();
}
} //End of DBLog class
From my Java application class, I am calling as follows,
import com.util.dblog;
public class myApp{
DBLog.logmethod1(param1, param2);
....
DBLog.logmethod2(param1, param2, param3);
...
} //End of myApp class
そして、 Filter クラス内のリクエストレベルで saveCon() を呼び出し、 sessionListener クラスの destroy() メソッド内で closeCon() を呼び出しています。logmethod1 と logmethod2 内の接続オブジェクトをコミットする代わりに、コミットの頻度を減らすためにこれを行っています。このメソッドは、アプリケーションで 5 ~ 10 回呼び出されます。したがって、リクエストごとに 10 回ではなく、10 回に 1 回コミットします。別の http リクエストがあり、10 個のログが挿入されると別のコミットがあるとします。そして最後に、セッションが破棄されそうになったら接続を閉じます。
今私が持っている質問は、DBLog クラスの静的ブロックで作成された接続オブジェクト「con」が、静的メソッド logmethod1 および logmethod2 で使用できるかどうかです。クラスが最初にロードされたときに作成され、アプリケーションスコープ全体で利用できることを願っていますか? 多くのユーザーが入ってくるので、このアプローチが正しいのか、それとも他のアプローチが必要なのか心配です。不明な点がある場合はお知らせください。折り返しご連絡いたします。