JavaWeblogicポータルアプリケーションの特定の詳細をOracleDBに記録するために、データベースロギングを実装しました。このために、接続プールを使用して接続を取得し、それを使用してストアドプロシージャへのjdbc呼び出しを行います。
接続オブジェクトを取得してSPを呼び出す静的JavaメソッドlogServiceがあります。このlogserviceメソッドは、Javaアプリケーションのさまざまな場所から呼び出され、関連する詳細がパラメーターに渡され、パラメーターがSP呼び出しに渡されます。
したがって、ポータルにアクセスするユーザーごとに、約10〜20のlogserviceメソッド呼び出しがあります。したがって、10〜20のSP呼び出しを行い、SPを呼び出すたびにコミットする必要がありました。
しかし、問題は、コミット頻度が高いため、私のDBAは、トランザクションごとにコミットせず、一度に10〜20個のトランザクションすべてをコミットすることを推奨していることです。どうすればこれを達成できますか?明確でない場合は、サンプルコードを投稿できます。
はい、次のようにWebアプリケーション用のフィルターを既に使用しています。
public final class RequestFilter implements Filter{
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
try {
((HttpServletResponse) response).sendRedirect(redirectUrl);
if (chain != null) {
chain.doFilter(request, response);
}
}
finally { // commit transaction here }
}
}
redirectURLにリダイレクトした後、次のようにアプリケーションの多くの場所からlogserviceを呼び出しています。
DBLog.logService(param1, param2); // static method call
このログサービスは、接続プールオブジェクトを使用してSPへのprepareCallを実行します。以下に、私が行っている方法の簡単なサンプルコードを示します。
public static void logService(String param1, String param2) {
try {
con=getConnection();
stmt = con.prepareCall("{call DB_LOG_SP (?, ?}");
stmt.setString(1, param1);
stmt.setString(2, param2);
stmt.execute();
stmt.close();
}finally {
stmt.close();
con.close();
}
}
しかし、SP呼び出しの後に接続を閉じているので、doFilterメソッド内のfinally {}ブロックでトランザクションをコミットするにはどうすればよいですか?
フィルターアプローチ-
public class DBLog {
static Connection con = null;
static PreparedStatement stmt = null;
static {
try{
new net.verizon.whatsnext.dblog.JDCConnectionDriver("oracle.jdbc.driver.OracleDriver",
"jdbc:oracle:thin:@localhost:7001:xe","user", "password");
con=getConnection(); // Getting connection from Connection pool
}catch(Exception e){}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:jdc:jdcpool");
}
public static void logService(String param1, String param2) {
...
finally {
stmt.close();
}
}
public static void closeTrans() {
con.commit();
con.close();
}
} //End of DBLog class
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
...
finally {
DBLog.closeTrans();
}
}
そのため、doFilterメソッドのfinallyブロックでコミットした後、finallyに接続を閉じています。私は正しくやっていますか?それは機能しますか?