2013-11-20 5 views
0

Я пишу программу Java, которая пересекает все под каталогом пользователя, который ищет базы данных h2 и отображает их содержимое. Вот код, который я написал до сих пор:Правильный способ удаления багажа JDBC создает?

private void openDatabase(File file) { 
    try { 
     Class.forName("org.h2.Driver"); 
     Connection connection; 
     try { 
      connection = DriverManager.getConnection("jdbc:h2:" + file.getAbsolutePath()); 
      DatabaseMetaData md = connection.getMetaData(); 
      ResultSet resultSet = md.getTables(null, null, "%", null); 
      while (resultSet.next()) { 
       System.out.println("TABLE: " + resultSet.getString(3)); 
      } 
      connection.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       try { 
        connection.close(); 
       } catch (SQLException e2) { 
        e2.printStackTrace(); 
       } 
      } 
     } 
    } catch (ClassNotFoundException e1) { 
     e1.printStackTrace(); 
    } 
} 

Это делает хорошо - он находит (db) и печатает таблицы в ней. Только одна проблема. Каждый раз, когда он находит (db), он создает (db).h2.db и (db).trace.db. Это означает, что при последующих запусках моей программы он находит и сканирует их в дополнение к (db). Это было бы неважно, за исключением того, что на третьем этапе он создает (db).h2.db.h2.db, (db).trace.db.h2.db, (db).h2.db.trace.db и (db).trace.db.trace.db. И так далее. Это проблема, которая растет экспоненциально.

Что я делаю неправильно? Как я могу либо предотвратить его от создания этих дополнительных файлов целиком, либо очистить его после себя, когда это будет сделано?

+0

Странно. Я думаю, вы можете просто отфильтровать что-нибудь с помощью «.h2». или ".trace". –

ответ

1

Для ядра базы данных H2 URL-адрес JDBC jdbc:h2:/directory/test означает, что содержимое базы данных хранится в файле /directory/test.h2.db. Это означает, что URL-адрес базы данных точно соответствует имени файла.

Так что вы могли бы сделать это, вместо того, чтобы использовать имя файла напрямую, используйте:

String fileName = file.getAbsolutePath(); 
if (!fileName.endsWith(".h2.db")) { 
    // not a H2 database 
    return; 
} 
String databaseName = fileName.substring(0, fileName.length() - ".h2.db".length()); 
String url = "jdbc:h2:" + databaseName; 
+0

Спасибо! Это решило другие проблемы, с которыми я сталкивался, о которых я не упоминал, например, о том, что инструкции SQL не нашли таблицы, которые, как я знал, были в db. Я подозреваю, что он создавал новый db, а затем запускал заявления на них. Только одна небольшая часть вопроса, на который не был дан ответ - как я могу предотвратить его создание файла трассировки? Это всего лишь небольшая программа диагностики, которая извлекает несколько идентификаторов и имен из базы данных, ей не нужно выполнять какие-либо объединения или что-то еще, поэтому я не думаю, что мне нужен/нужен файл трассировки. – ArtOfWarfare

+0

Файл трассировки: что он содержит? Его следует создавать только в случае возникновения исключения или другой проблемы. –

+0

Я не знаю, как это проверить, но я нашел эту документацию по функции трассировки: http://www.h2database.com/html/features.html#trace_options – ArtOfWarfare

1

Thomas Mueller's Answer помогли с уборкой большую часть дополнительных файлов, но одна вещь, которую он оставил от был, как очистить файлы трассировки. Я нашел some documentation, который объяснил, как избавиться от этих файлов.

Вы можете вставить опции в URL-адрес соединения, разделенные точками с запятой. Они принимают форму option_key = option_value. Две из опционных клавиш: TRACE_LEVEL_SYSTEM_OUT и TRACE_LEVEL_FILE. Каждый из них может быть установлен на 0 (выкл.), 1 (ошибка), 2 (информация) или 3 (отладка).

Вот за исключением кода, который я написал, используя параметры, чтобы правильно открыть базу данных, без дополнительных .h2.db файлов, без файла трассировки производится, и с информацией происходит в системный журнал:

String path = file.getAbsolutePath(); 
String url = "jdbc:h2:" + path.substring(0, path.length()-6); // jdbc:h2 doesn't like file extensions in the path - remove the .h2.db 
String options = ";TRACE_LEVEL_FILE=0;TRACE_LEVEL_SYSTEM_OUT=2"; // put info on the console, not in a log file 
Connection connection = DriverManager.getConnection(url + options); 
Смежные вопросы