私は、Java Weblogicポータルアプリケーションの特定の詳細をOracle DBに記録するためにデータベースログを実装しました。 このために、接続プーリングを使用して接続を取得し、jdbcを呼び出してストアドプロシージャを呼び出します。jdbc呼び出しで、一度にコミットを減らして一括レコードを挿入しますか?
私は接続オブジェクトを取得してSPを呼び出す静的JavaメソッドlogServiceを持っています。 このlogserviceメソッドは、Javaアプリケーションのさまざまな場所から呼び出され、関連する詳細がintでSPコールに渡されるパラメータで渡されます。
したがって、ポータルにアクセスする各ユーザーに約10-20のログサービスメソッド呼び出しがあります。 それで、私は10-20のSPコールを行い、私はSPを呼び出すたびにコミットしなければなりませんでした。
しかし、問題は、私のDBAは、コミット頻度が高いので、一度にすべてのトランザクションをコミットしないことをお勧めしています。 これはどのようにして達成できますか?明確でない場合は、サンプルコードを投稿できます。次のように
はい、私はすでに、次のように
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を呼び出しています、私のWebアプリケーション用に
DBLog.logService(param1, param2); // static method call
これをフィルターを持っていますlogserviceは、接続プールオブジェクトを使用して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メソッドのブロックにコミットした後、最終的に接続を閉じています。 私は正しくやっていますか?それは働くでしょうか?
より具体的なplzすることができます。 –
開かれたトランザクションを使用してサーブレットを包むことになる、あなたのウェブ・アプリケーションにフィルタを追加: ます。public voidのdoFilter(ServletRequestのREQ、RESPたServletResponse){ 試し{ここ //開いているトランザクション filterChain.doFilter(REQ、RESP) ; } finally { //ここでトランザクションをコミットしてください } } – ahanin
良いですが、plzはdoFilterでコミットする方法を提案しています。私は上記の投稿に詳細を追加しました。 –