내 Java weblogic 포털 응용 프로그램의 특정 세부 사항을 Oracle DB에 기록하기 위해 데이터베이스 로깅을 구현했습니다. 이 때문에 연결 풀링을 사용하여 jdbc를 저장 프로 시저 호출에 사용합니다.jdbc 호출에서 커밋을 줄이고 대량 레코드를 한 번에 삽입 하시겠습니까?
나는 연결 개체를 가져 와서 SP를 호출하는 정적 java 메서드 logService가 있습니다. 이 logservice 메서드는 내 Java 응용 프로그램의 다른 위치에서 호출되며 관련 세부 정보는 int에서 SP 호출에 전달되는 매개 변수로 전달됩니다.
따라서 포털에 액세스하는 각 사용자에 대해 약 10-20 개의 logservice 메소드 호출이 있습니다. 그래서 10-20 SP 통화를하고 SP에 전화 할 때마다 커밋해야합니다.
하지만 문제는 내 DBA가 커밋 빈도가 높기 때문에 각 트랜잭션에 커밋하지 말고 inturn이 한 번에 10-20 개의 트랜잭션을 모두 커밋하도록 권장했습니다. 어떻게해야합니까? 명확하지 않으면 샘플 코드를 게시 할 수 있습니다. 다음과 같이
그래, 난 이미 다음과 같이
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
이 필터를 데 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 메서드 내에서 {{} 블록으로 트랜잭션을 커밋하는 방법은 무엇입니까?
필터 접근 -
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 수 있습니다. –
열 거래와 서블릿을 감싸는 것이다, 당신의 웹 응용 프로그램에 필터를 추가 공공 무효 doFilter (ServletRequest의 REQ, ServletResponse를의 RESP) { 시도 {여기 // 열려있는 트랜잭션 filterChain.doFilter (REQ, RESP) ; } finally { // 여기서 트랜잭션을 커밋하십시오. } } – ahanin
괜찮습니다.하지만 plz는 doFilter를 커밋하는 방법을 제안합니다. 위의 게시물에서 자세한 내용을 추가했습니다. –