Я внедрил ведение журнала базы данных для регистрации определенных деталей в моем приложении веб-портала java для Oracle DB. Для этого я использую пул соединений, чтобы получить соединение и использовать его для вызова jdbc для хранимой процедуры.Уменьшение фиксации и вставка объемных записей за раз в вызове jdbc?
У меня есть статический java-метод logService, который получает объект соединения и вызывает SP. Этот метод logservice вызывается из разных мест моего приложения Java с соответствующими данными, переданными в параметрах, которые inturn передается на вызов SP.
Таким образом, для каждого пользователя, обращающегося к порталу, будет задействовано около 10-20 вызовов метода logservice. Итак, я буду делать 10-20 вызовов SP, и мне приходилось совершать каждый раз, когда я вызываю SP.
Но проблема заключается в том, что мой администратор базы данных рекомендовал не совершать транзакции для каждой транзакции, а 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 готовитCall к SP с использованием объекта объединения пула. Просто я даю короткий пример кода, как я это делаю.
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. Я правильно? Это будет работать?
может быть более конкретным плз. –
добавить фильтр на веб-приложение, которые будут обернуть сервлет с открытой сделкой: общественной ничтожной doFilter (ServletRequest REQ, ServletResponse гезр) { попытки { // открытой транзакция здесь filterChain.doFilter (REQ, соответственно) ; } finally { // совершите транзакцию здесь } } – ahanin
Прекрасно .. Но plz подскажет, как зафиксировать в doFilter .. Я добавил дополнительные данные в свой пост выше. –