2012-06-01 2 views
0

Я очень новичок в использовании драйвера подключения jtds. Я написал приложение, которое читает около 2500 больших xml и обрабатывает SQL-запросы и запускается с SQL-сервером. Я видел, что, когда я достигаю определенного количества xml, у меня не работает программа. Я проверил свой файл дампа phd в eclipse с помощью анализатора памяти и обнаружил, что net.sourceforge.jtds.jdbc.cache.SimpleLRUCache занимает много памяти. Я подключаюсь к SQL-серверу один раз и поддерживаю соединение до тех пор, пока не сброшу все мои запросы. Ниже приведен мой код для запуска запросов к серверу. Я не знаю, как получить дескриптор класса net.sourceforge.jtds.jdbc.cache.SimpleLRUCache, поскольку у него есть ясный метод, который, я думаю, может очистить кеш. Снова я не очень хорошо разбираюсь в драйверах jtds. Может ли кто-нибудь помочь мне решить эту проблему?net.sourceforge.jtds.jdbc.cache.SimpleLRUCache вызывает утечку памяти

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

FAQ объясняет, как изменить размер кэша заявление, установив более низкое значение для maxStatements в URL JDBC. Если вы создаете очень большие операторы, вы можете установить этот предел намного ниже значения по умолчанию 500. Также вы можете посмотреть некоторые другие параметры памяти.

+0

Спасибо, Джон. Это решило мою проблему. –

Смежные вопросы