我有以下方法将某些内容从我的 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 次。假设有另一个 http 请求,一旦插入 10 个日志,就会有另一个提交。最后,一旦会话即将被销毁,我将关闭连接。
现在我遇到的问题是,在 DBLog 类的静态块中创建的连接对象“con”可用于静态方法 logmethod1 和 logmethod2 吗?我希望它是在第一次加载类时创建的,并且在整个应用程序范围内都可用?因为会有很多用户进来,我担心这种方法是正确的,还是需要任何其他方法?如果不清楚,请告诉我,我会回来的。