При разработке распределенного приложения часто возникает необходимость использовать базу данных. Один из признаков гибкой разработки является возможность сменить базу данных в процессе создания программного продукта без изменения в коде.
HSQLDB предоставляет нам возможность не устанавливая дополнительного ПО использовать SQL базу данных в нашем приложении. Причем подключение к базе происходит с помощью JDBC драйвера. А это значит, что мы можем просто поменять базу данных на любом этапе разработки и, даже, использования приложения.
У HSQLDB два режима работы:
- режим сервера
- режим "in-process"
В режиме сервера HSQLDB доступна так же как и любая другая серверная БД через какой-нибудь порт.
Режим "in-process", наверное, самый интересный в этой базе данных. Данные могут храниться в оперативной памяти, в файле и в jar-архиве. В jar-архиве, правда, только в режиме read-only.
Доступ к БД существует только в процессе. Самый быстрый вариант - конечно использовать БД в оперативной памяти. Но на практике чаще понадобится использовать хранение данных в файле. Так мы сможем надеяться на сохранность данных при завершении приложения.
Неприятный момент при работе с HSQLDB в том, что по завершении работы с БД нужно выполнить SQL команду "SHUTDOWN" для освобождения ресурсов.
Так же в режиме "in-process" нельзя получить два Connection к одной базе, что накладывает на нас ограничение на скорость выполнения запросов. В многопоточной среде мы не сможем параллельно выполнять несколько запросов, нам придется ждать освобождения соединения. Но мы всегда можем запустить HSQLBD в качестве сервера.
Так же в режиме "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.
Комментариев нет:
Отправить комментарий