请原谅我,如果已经回答这个问题,虽然我搜索过但无法找到让我确信能够以某种方式做出决定的信息。所以这是我的问题。
我正在扩展一个Spring应用程序,并编写了一个Java类库,用于管理一个单独的数据库表(在一个单独的数据库中,与Spring应用程序使用的数据库完全相同)。因此,我的类在此应用程序中的Beanshell命名空间内使用。
我已经编写了我的主要类来利用按需初始化持有者的习惯用法。所以你基本上得到了我的类的实例,它使用BasicDataSource与我的数据库进行交互。某些交互(可能更多,我知道,因为它正在由另一位分析师进行测试)导致JVM挂起。我相信这与数据库连接有关。
我有像updateRecord(String),updateMultipleRecords(List ...)等方法。这些包含在try / catch / finally语句中的方法是TRY中的openConnection()方法和FINALLY中的closeConnection()。 / p>
这是持有人......
private static class MyClassHolder {
private static final MyClass INSTANCE = new MyClass();
}
/**
* Returns the Singleton instance of MyClass
* @return The/an Instance of {@link MyClass}
*/
public static MyClass getInstance(){
return MyClassHolder.INSTANCE;
}
这是一个有问题的方法......
public RequestStatus addToList(List<String> ids) {
RequestStatus status;
try{
openConnection();
stmt = conn.prepareStatement(QUERY_UPDATE_BLACKLIST);
for (int i = 0; i < ids.size(); i++){
MyClassStatus resStatus = checkIdStatus(ids.get(i));
if (MyClassStatus.AVAILABLE == resStatus){
stmt.setString(1, ids.get(i));
stmt.addBatch();
} else {
// This should be a log statement
System.out.println("NOT MODIFYING " + ids.get(i) + ": STATUS IS: " + resStatus);
}
}
stmt.executeBatch();
status = RequestStatus.SUCCESS;
} catch (SQLException ex){
status = RequestStatus.FAIL;
ex.printStackTrace();
} finally {
closeConnection();
}
return status;
}
以及打开和关闭连接方法......
/**
* Just a method to open a database connection
*/
private void openConnection(){
if (conn == null){
try {
conn = dataSource.getConnection();
} catch (Exception ex){
ex.printStackTrace();
}
}
}
/**
* Just a method to close an open database connection
*/
private void closeConnection(){
if (conn != null){
try{
conn.close();
} catch (SQLException sqlex){
sqlex.printStackTrace();
}
}
}
此模式是否会导致内存泄漏?我现在无法访问正在测试的系统,所以我无法运行任何类型的分析工具。所以我试图首先排除明显的模式问题。
任何帮助将不胜感激。如果需要更多信息,我很乐意提供更多信息。
谢谢!