net.sourceforge.jtds.jdbc.cache.SimpleLRUCache导致内存泄漏

时间:2012-06-01 00:00:41

标签: java memory jtds

我是非常新的使用jtds连接驱动程序。我编写了一个应用程序,它可以读取大约2500个大型xml,并进行SQL查询并针对SQL服务器运行。我已经看到,当我达到一定数量的xml时,我的程序会运行内存不足。我使用内存分析器在eclipse中检查了我的phd转储文件,发现net.sourceforge.jtds.jdbc.cache.SimpleLRUCache占用了大量内存。我连接到SQL服务器一次并保持连接活动直到我清除所有查询。下面是我对服务器运行查询的代码。我不知道如何获得net.sourceforge.jtds.jdbc.cache.SimpleLRUCache类的句柄,因为它有一个清晰的方法,我认为可能会清除缓存。再次,我对jtds驱动程序知之甚少。任何人都可以帮我解决这个问题吗?

public boolean runQueries(String query){
    if (getConn() != null && query != null) {
        Statement statement = null;
        try {
            long start = System.currentTimeMillis();
            try {
                if(log.isLoggable(Level.FINEST)){
                    log.finest("Processing: "+query);
                }
                statement = getConn().createStatement();
                statement.executeUpdate(query);
            } catch (Exception e) {
                if(log.isLoggable(Level.FINEST)){
                    log.log(Level.SEVERE, "Failed to process        query: "
                        + query, e);
                }else{
                    String reportQuery = query.length() > MAX_CHARS_DISPLAY ? query.substring(0,MAX_CHARS_DISPLAY)+"..." : query;
                        log.log(Level.SEVERE, "Failed to process query: "
                                + reportQuery , e);
                }
            }finally{
                if(statement != null){
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        log.log(Level.SEVERE,"Failed to close statement: ",e);
                    }
                }
            }

            long end = System.currentTimeMillis();

            return true;
        }finally{
            if(statement != null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    log.log(Level.SEVERE,"Failed to close statement: ",e);
                }
            }
        }
    }
    return false;
}

1 个答案:

答案 0 :(得分:1)

FAQ解释了如何通过在JDBC URL中为maxStatements设置较低的值来更改语句高速缓存的大小。如果要构建非常大的语句,则可能需要将该限制设置为远低于默认值500.您还可能希望查看其中的一些其他内存设置。