Java Singleton实例和BasicDataSource潜在的内存泄漏?

时间:2016-02-16 17:42:17

标签: java database spring memory-leaks singleton

请原谅我,如果已经回答这个问题,虽然我搜索过但无法找到让我确信能够以某种方式做出决定的信息。所以这是我的问题。

我正在扩展一个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();
        }
    }
}

此模式是否会导致内存泄漏?我现在无法访问正在测试的系统,所以我无法运行任何类型的分析工具。所以我试图首先排除明显的模式问题。

任何帮助将不胜感激。如果需要更多信息,我很乐意提供更多信息。

谢谢!

0 个答案:

没有答案