2012-07-20 7 views
2

Я использую программу Java GUI для обновления базы данных SQlite. Мои опции Gui - это в основном кнопки переключения с значениями включения/выключения. Из-за характера Gui производительность при обновлении базы данных должна быть быстрой, поэтому управление может быть быстро возвращено функции вызова Gui.Обновление Java-базы данных SQL-базы данных

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

public static void updateDCStable(String item, int value) 
{ 
    try { 
     long start = System.currentTimeMillis(); 
     Class.forName("org.sqlite.JDBC"); 
     String url = DATABASE_FILEPATH; 
     Connection conn = DriverManager.getConnection(url); 

     Statement update = conn.createStatement();   
     update.execute("UPDATE DCS " 
       + "SET " + item + "='" + value + "';"); 

     update.close(); 
     conn.close(); 

     long time_elapsed = System.currentTimeMillis() - start; 
     System.out.println("Changed DCS date item " + item + " to " 
       + value + " in " + time_elapsed + "(ms)"); 
    } catch (SQLException ex) { /* Error handling */ 
    } catch (ClassNotFoundException ex) { /* Error handling */ 
    } 
} 

My SQL таблица является в основном конфигурации информация с несколькими столбцами и только одна строка, поэтому функция принимает колонки и обновить значение и соответственно обновить элемент. Функция работает правильно, ее просто очень медленно ....

Использование времени, прошедшего, мое среднее время обновления работает около 550 мс или около того с минимальным временем 294 мс и максимальным временем в 986 мс. Есть ли способ ускорить этот процесс?

ответ

3

Это было бы быстрее, если вы использовали соединение из пула соединений. Вам не нужно было устанавливать и закрывать соединение каждый раз при доступе к базе данных, что занимает много времени.

Подготовленные записи, упомянутые Пьером, также помогут, но большая часть времени, затраченного на работу с базой данных, - это установка/выпуск проблем с подключением к базе данных.

+0

Благодарим за полезный ответ. Да, я понял, что связь была самой дорогой частью вычислительно. Поэтому я реализовал пул соединений с базой данных BoneCP Java, используя пример из [этого сайта] (http://tunatore.wordpress.com/2011/11/07/how-to-use-bonecp-java-database-connection-pool- JDBC-бассейн-библиотека /). Теперь мой вспомогательный код пытается использовать conn = ConnectionManager.getConnection() для настройки соединения. Проблема в том, что моя производительность в основном одинакова со средним временем 752 (мс), min 262 (мс) и макс 2919 (мс). Правильный код примера, или я что-то упускаю? –

+0

Запустите еще несколько тестов. Первое выполнение кода займет больше времени (установление соединения и добавление его в пул соединений), но для последних исполнений требуется меньше времени. Также выполните подготовленное заявление. Это также поможет. –

+0

Это делает трюк, спасибо! Среднее падение до 500 мс, которое ближе к допустимому. Какие бы вы ожидали от такого типа операций с Java, Sqlite и BoneCP вместе с типом записи, которую я делаю? Просто любопытно. –

2

Используйте один основное соединение (инициализируется один раз) и PreparedStatement:

SQL-оператор прекомпилируется и хранится в PreparedStatement объекта. Затем этот объект можно использовать для эффективного выполнения этого оператора несколько раз.

void updateDCStable(Connection conn,String item, int value) {(...) 
PreparedStatement ps = conn.prepareStatement("UPDATE DCS set "+ item +"= ?"); 
ps.setInt(1,value); 
Смежные вопросы