суббота, 6 апреля 2013 г.

Пример работы с HSQLDB



При разработке распределенного приложения часто возникает необходимость использовать базу данных. Один из признаков гибкой разработки является возможность сменить базу данных в процессе создания программного продукта без изменения в коде.

HSQLDB предоставляет нам возможность не устанавливая дополнительного ПО использовать SQL базу данных в нашем приложении. Причем подключение к базе происходит с помощью JDBC драйвера. А это значит, что мы можем просто поменять базу данных на любом этапе разработки и, даже, использования приложения.



У HSQLDB два режима работы:

  • режим сервера
  • режим "in-process"

В режиме сервера HSQLDB доступна так же как и любая другая серверная БД через какой-нибудь порт.

Режим "in-process", наверное, самый интересный в этой базе данных. Данные могут храниться в оперативной памяти, в файле и в jar-архиве. В jar-архиве, правда, только в режиме read-only.
Доступ к БД существует только в процессе. Самый быстрый вариант - конечно использовать БД в оперативной памяти. Но на практике чаще понадобится использовать хранение данных в файле. Так мы сможем надеяться на сохранность данных при завершении приложения.

Неприятный момент при работе с HSQLDB в том, что по завершении работы с БД нужно выполнить SQL команду "SHUTDOWN" для освобождения ресурсов.

Так же в режиме "in-process" нельзя получить два Connection к одной базе, что накладывает на нас ограничение на скорость выполнения запросов. В многопоточной среде мы не сможем параллельно выполнять несколько запросов, нам придется ждать освобождения соединения. Но мы всегда можем запустить HSQLBD в качестве сервера.

На сайте http://hsqldb.org есть инструкция и сама БД с исходниками. Разработчики заботливо положили внутрь архива hsqldb.jar, который мы и будем использовать.

Сначала я приведу листинг для самых нетерпеливых. А потом расскажу поподробнее о некоторых моментах.


package org.anteastra; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestHSQLDB { Connection connection = null; public static void main(String[] args){ TestHSQLDB test = new TestHSQLDB(); if (!test.loadDriver()) return; if (!test.getConnection()) return; test.createTable(); test.fillTable(); test.printTable(); test.closeConnection(); } private boolean loadDriver() { try { Class.forName("org.hsqldb.jdbcDriver"); } catch (ClassNotFoundException e) { System.out.println("Драйвер не найден"); e.printStackTrace(); return false; } return true; } private boolean getConnection() { try { String path = "mypath/"; String dbname = "mydb"; String connectionString = "jdbc:hsqldb:file:"+path+dbname; String login = "joe"; String password = "password"; connection = DriverManager.getConnection(connectionString, login, password); } catch (SQLException e) { System.out.println("Соединение не создано"); e.printStackTrace(); return false; } return true; } private void createTable() { try { Statement statement = connection.createStatement(); String sql = "CREATE TABLE testTable (id IDENTITY , value VARCHAR(255))"; statement.executeUpdate(sql); } catch (SQLException e) { } } private void fillTable() { Statement statement; try { statement = connection.createStatement(); String sql = "INSERT INTO testTable (value) VALUES('Вася')"; statement.executeUpdate(sql); sql = "INSERT INTO testTable (value) VALUES('Петя')"; statement.executeUpdate(sql); sql = "INSERT INTO testTable (value) VALUES('Саша')"; statement.executeUpdate(sql); sql = "INSERT INTO testTable (value) VALUES('Катя')"; statement.executeUpdate(sql); sql = "INSERT INTO testTable (value) VALUES('Света')"; statement.executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); } } private void printTable() { Statement statement; try { statement = connection.createStatement(); String sql = "SELECT id, value FROM testTable"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { System.out.println(resultSet.getInt(1) + " " + resultSet.getString(2)); } } catch (SQLException e) { e.printStackTrace(); } } private void closeConnection() { Statement statement; try { statement = connection.createStatement(); String sql = "SHUTDOWN"; statement.execute(sql); } catch (SQLException e) { e.printStackTrace(); } } }

Первым делом необходимо подключить hsqldb.jar к проекту. Это делается достаточно легко. В eclipse это можно сделать, добавив jar-файл через контекст проекта:
properties->java build path->libraries->add jars...

Вот так выглядит мой проект:
Абсолютно никаких дополнительных настроек не требуется. Можно запускать код. В корне проекта появятся файлы базы данных.

TestHSQLDB test = new TestHSQLDB(); if (!test.loadDriver()) return; if (!test.getConnection()) return; test.createTable(); test.fillTable(); test.printTable(); test.closeConnection();

В методе loadDriver() происходит загрузка драйвера JDBC. Поподробнее про загрузку драйвера - тут.
В методе getConnection() устанавливается соединение с БД по URL "jdbc:hsqldb:file:mypath/mydb".

В методах createTable(), fillTable(), printTable() происходят простейшие CRUD-операции, характерные для любой SQL базы данных.

Метод closeConnection() выполняет SQL команду SHUTDOWN и освобождает связанные ресурсы. В нашем случае файлы базы данных в mypath/mydb.


Комментариев нет:

Отправить комментарий