Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java单例实例和源代码是否存在潜在内存泄漏?_Java_Database_Spring_Memory Leaks_Singleton - Fatal编程技术网

Java单例实例和源代码是否存在潜在内存泄漏?

Java单例实例和源代码是否存在潜在内存泄漏?,java,database,spring,memory-leaks,singleton,Java,Database,Spring,Memory Leaks,Singleton,如果这个问题已经得到了回答,请原谅我,尽管我搜索了一些信息,但找不到这些信息,这些信息让我有信心以某种方式做出决定。这是我的问题 我正在扩展一个Spring应用程序,并编写了一个Java类库,用于管理一个单独的数据库表(在Spring应用程序使用的数据库中)。因此,我的类在这个应用程序的Beanshell名称空间中使用 我已经编写了我的主类来利用按需初始化持有者习惯用法。因此,您基本上得到了my类的一个实例,它使用BasicDataSource与我的数据库进行交互。某些交互(可能比我所知道的更多

如果这个问题已经得到了回答,请原谅我,尽管我搜索了一些信息,但找不到这些信息,这些信息让我有信心以某种方式做出决定。这是我的问题

我正在扩展一个Spring应用程序,并编写了一个Java类库,用于管理一个单独的数据库表(在Spring应用程序使用的数据库中)。因此,我的类在这个应用程序的Beanshell名称空间中使用

我已经编写了我的主类来利用按需初始化持有者习惯用法。因此,您基本上得到了my类的一个实例,它使用BasicDataSource与我的数据库进行交互。某些交互(可能比我所知道的更多,因为它目前正在由另一位分析师测试)导致JVM挂起。我相信这与DB连接有关

我有像updateRecord(String)、updateMultipleRecords(List…)之类的方法。我认为这些方法包装在try/catch/finally语句中,是try中的openConnection()方法,finally中的closeConnection()方法

这是持卡人

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();
        }
    }
}
这种模式会导致内存泄漏吗?我现在无法访问正在测试的系统,因此无法运行任何类型的分析工具。因此,我试图首先排除明显的模式问题

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


谢谢大家!

你的问题有一半是解释你为什么做一些决定,这实际上是不相关的。第二部分并不代表任何可能相关的实现细节(我所说的细节是指代码)。无法帮助您使用您提供的信息。提供的信息是为了添加上下文,以防上下文相关。以免与在自己的类加载jvm中运行的类混淆。它们加载了我正在扩展的应用程序。它们在该应用程序中的Beanshell名称空间中使用(如果这也有影响的话)。我还没有在这里发布大量的问题,所以如果有更好的方式来编排这个问题,我会很乐意这样做。我将用代码示例更新原始代码,但我不确定要进行哪些更改以提供适当的上下文。您需要关注细节,尽量消除与问题无关的所有内容。然后添加尽可能少的代码来表示您认为导致问题的地方。然而,TBH通常最好的方法是找到一种在本地机器上复制bug的方法,然后使用Java world提供的所有优秀工具。更新时使用了越来越多的信息,请参见@user3707125关于
conn
field?它同步正确吗?是否有可能多个线程同时访问
openConnection