Чем открыть базу h2

Обновлено: 06.07.2024

СОДЕРЖАНИЕ ЦИКЛА СТАТЕЙ Продолжаем наш проект. Как создать веб проект. Подключаем базу к своему веб проекту. В этот раз букв будет больше, пятью минутами не обойдемся. В прошлой статье я советовал почитать про Spring несколько страниц или несколько статей, или хотя бы погуглить про что такое бины, контекст, сущности ,внедрение зависимостей в spring, способы конфигурации бинов. Если нет, то советую это сделать сразу сейчас или после этой статьи. Перед тем как наполнять нашу h2 базу. Необходимо создать класс утилиту для запуска в ней методов по заполнению базы. В пакете Создаем пакет для утилит И саму утилиту: Запустим приложение и в консоль выведется "run". Нам нужна эта утилита, в качестве альтернативы классу Applications, так как он должен отвечать только за запуск приложения. Создадим сущности. Сущность - это бин, цель которого хранить некоторые данные. В пакете Создаем пакет для сущностей И саму сущность, пусть это будет фрукты: Создаем пакет для репозиториев И сам репозиторий Вопрос, а почему тело интерфейса пустое, нет ни одного метода, что он объявляет? Для ответа зажмем Ctrl и кликнем на JpaRepository и посмотрим что он и сам наследуется от PagingAndSortingRepository<t, ""> и QueryByExampleExecutor<>, они тоже объявляют какие то методы. Не буду сюда копировать методы сами по смотрите. Поскольку репозиторий это интерфейс, он ни чего не делает, он только объявляет методы, необходим еще кто-то что бы эти методы реализовать. Для этого придуман "сервис". В пакете Создаем пакет для сервисов И сам сервис Сейчас мы дошли до важного момента: "Как и зачем заинжектить бин" (внедрить зависимость). Если вы не понимаете о чем это я, то прошу вас почитать на эту тему, сейчас или после, особенно обратите внимание на способы "инжекта",сколько их, какой лучше, какой хуже, и почему. Мы используем один из способов. Нам нужно что бы "сервис" как то был связан с "репозиторием". Дополняем наш сервис аннотацией и переменной. Теперь можно реализовать метод из "репозитория" Дополняем "сервис" Осталось только реализовать это в нашей утилите Переходим к классу InitiateUtils Вывод в консоль: FruitEntity(id=1, fruitName=fruit1, providerCode=1) FruitEntity(id=2, fruitName=fruit2, providerCode=2) FruitEntity(id=3, fruitName=fruit3, providerCode=3) Вот тут можно и закончить. "Секундочку!" - воскликнет самый внимательный читатель - "А где же тут все таки Hibernate?" А Hibernate выступает здесь в роли борца невидимого фронта, он сделал очень важную вещь: создал нам структуры БД. Вот когда мы в "сущности" написали поля, и пометили нужными аннотациями, Hibernate сделал свое дело. На самом деле, при разработке на проме вы вряд ли будете заниматься структурой БД, все уже будет создано и развернуто за вас. Но в таких небольших проектах Hibernate со своим умением делать структуры БД просто не заменим, конечно это его не единственный плюс, например он хорош в создании связанных сущностей (в этом проекте мы не будем их использовать). Давайте поздороваемся с этим скромным трудягой: зайдем в IDEA в структуру проекта (слева такое дерево с папочками и файликами ), там найдем External Libraries раскроем его и среди прочих библиотек увидим В частности Hibernate был выкачан для нас мавеном и На самом деле мистер Hiber провел еще одну скрытую операцию, но о ней мы поговорим в следующей статье. Вот теперь точно всё. В качестве тренировки предлагаю вам самим реализовать метод saveAll() для FruitEntity который сохранит все сущности в базу за один раз. Дальше по смотрим как сократить код проекта с помощью библиотеки Lombok

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

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

H2 - это база данных Java SQL. Основные особенности H2:

H2 использование

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

Другое его использование - для модульного тестирования. Скорость запуска высока, и функцию сохранения можно отключить.После выполнения каждого варианта использования он будет возвращен в исходное состояние.

Третье использование H2 в качестве кеша, как дополнение к NoSQL. Когда модель данных должна быть реляционной в некоторых сценариях, ее можно использовать как Memcached в качестве буферного уровня серверной части MySQL / Oracle для кэширования данных, которые не часто меняются, но требуют частого доступа, например таблиц словаря и таблиц разрешений. Но эта системная архитектура будет более сложной.

Режим работы H2

H2 поддерживает три различных режима работы, чтобы соответствовать большему количеству различных сценариев применения.

1. Встроенный режим

Во встроенном режиме H2 и приложение запускаются в одной JVM, а H2 запускается приложением. Этот режим также является наиболее эффективным и официально рекомендованным.

Недостатком является то, что базу данных можно открыть только на виртуальной машине (и в загрузчике классов) в любое время. Как и во всех режимах, поддерживаются как постоянные базы данных, так и базы данных в памяти. Нет ограничений на количество одновременно открытых баз данных или количество открытых соединений.

Во встроенном режиме операции ввода-вывода могут выполняться потоками приложений, которые выполняют команды SQL. Приложение не может прерывать эти потоки, это может вызвать повреждение базы данных, потому что JVM закрывает дескриптор ввода-вывода во время прерывания потока. Рассмотрим другие методы контроля выполнения приложения. Когда может произойти перерыв, вы можете async: Файловая система используется в качестве решения, но полная безопасность не может быть гарантирована. Рекомендуем использоватьКлиент-сервер Модель, клиент может прервать собственный поток.


Встроенный режим: локальное соединение с использованием JDBC

База данных постоянно хранится в виде одного файла.

/.h2/DBName Указывает место хранения файла базы данных.При первом подключении данные будут автоматически созданы.

2. Серверный режим

Серверный режим, также известный какУдаленный режим ИлиКлиент / сервер Режим, использование приложения JDBC Или ODBC API Удаленно ( TCP/IP Transfer) для доступа к базе данных. Аналогичен традиционным базам данных mysql и oracle.

Фактически, сам H2 Server также использует встроенный режим для запуска и запуска базы данных H2. Поскольку режим сервера - через удаленный ( TCP/IP Передача) данные доступа к соединению, его производительность ниже, чем в встроенном режиме.

Нет ограничений на количество одновременно открытых баз данных или открытых соединений на сервере.

[ , , (img-wXYwsXdC-1582599737369)(http://www.h2database.com/html/images/connection-mode-remote-2.jpg)]

Режим сервера: через JDBC или ODBC TCP/IP Установить удаленное соединение

H2 поддерживает три сервисных режима:

  • веб-сервер: этот режим работы поддерживает доступ браузера к консоли H2.
  • TCP-сервер: поддержка соединения клиент / сервер
  • Сервер PG: поддерживает клиент PostgreSQL

Пример строки подключения для запуска службы tcp:

/test Использовать домашний каталог пользователя

jdbc:h2:tcp://localhost//data/test Использовать абсолютный путь

3. Смешанный режим

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


Смешанный режим: одновременное локальное и удаленное подключение

Параметры строки подключения

DB_CLOSE_DELAY : Не закрывать базу данных после разрыва последнего соединения

MODE=MySQL : Режим совместимости, H2 совместим с несколькими базами данных, значение может быть: DB2, Derby, HSQLDB, MSSQLServer, MySQL, Oracle, PostgreSQL

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

AUTO_RECONNECT=TRUE : Автоматически переподключаться после потери связи

TRACE_LEVEL_SYSTEM_OUT 、 TRACE_LEVEL_FILE : Вывод журнала трассировки в консоль или файл, значение 0 - ВЫКЛ., 1 - ОШИБКА (значение по умолчанию), 2 - ИНФОРМАЦИЯ, 3 - ОТЛАДКА

SET TRACE_MAX_FILE_SIZE mb : Установите размер файла журнала трассировки, по умолчанию - 16M

Метод подключения к базе данных URL

тема Формат URL и примеры
Встроенное (локальное) соединение jdbc:h2:[file:][<path>]<databaseName>
jdbc:h2:

H2 прост в использовании

img

2. Распакуйте загружаемый пакет, и вы можете использовать его. Каталог после распаковки выглядит следующим образом

3. Запуск в среде Windows h2.bat , Запуск в среде Linux h2.sh Чтобы открыть консоль

По умолчанию служебный порт TCP базы данных H2 - 9092, порт клиента - 8082, а порт службы PG - 5435.

img

5. Выберите китайский язык и нажмите «Подключиться», чтобы автоматически создать тестовую базу данных. Файл базы данных находится в

есть ли способ просмотреть содержимое базы данных H2 или HSQLDB в памяти для просмотра? Например, во время сеанса отладки с Hibernate, чтобы проверить, когда выполняется flush; или убедиться, что сценарий, который создает экземпляр DB, дает ожидаемый результат.

существует ли аддон или библиотека, которую вы можете встроить в свой код, чтобы разрешить это?

пожалуйста, укажите, о каком из них вы говорите (H2 или HSQLDB), если у вас есть ответить конкретно на один из них.

вы можете запустить H2 веб-сервер в вашем приложении, которое будет иметь доступ к той же базе данных в памяти. Вы также можете получить доступ к H2, работающему в режиме сервера, используя любой общий клиент JDBC, такой как SquirrelSQL.

теперь вы можете подключиться к базе данных через jdbc:h2:mem:foo_db URL в том же процессе или просмотрите foo_db база данных с помощью localhost:8082 . Не забудьте закрыть оба сервера. См. также: база данных H2 в режиме памяти невозможно получить доступ с помощью Console.

вы также можете использовать Spring:

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

N. B. Если вы используете Spring test framework, вы не увидите изменений, внесенных запущенной транзакцией, и эта транзакция будет откатываться сразу после теста.

для H2, вы можете запустите веб-сервер в своем коде во время сеанса отладки, если у вас есть объект подключения к базе данных. Вы можете добавить эту строку в свой код или как "выражение часов" (динамически):

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

в H2, что работает для меня:

I код, запуск сервера, как:

это запускает сервер на localhost порт 9092.

затем в коде установите соединение с БД по следующему URL-адресу JDBC:

при отладке в качестве клиента для проверки БД я использую тот, который предоставлен H2, что достаточно хорошо, чтобы запустить его, вам просто нужно запустить следующую Java main отдельно

запуск веб сервер с приложением на 8082, Запустите браузер на localhost:8082

и затем вы можете ввести предыдущий URL, чтобы увидеть DB

С HSQLDB у вас есть несколько встроенных опций.

есть два менеджера баз данных GUI и интерфейс командной строки для базы данных. Классы для них:

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

пример с JBoss приведен здесь:

вы также можете запустить сервер с ваше приложение, указывающее на базу данных в памяти.

вы можете выставить его как функцию JMX, начинающуюся через JConsole:

это контроллер Play 2 для инициализации H2 TCP и веб-серверов:

для HSQLDB для меня сработало следующее:

и это вызвало GUI с моими таблицами и данными.

Я также попробовал версию Swing, но у нее был только main , и я не был уверен в аргументах для передачи. Если кто знает, пожалуйста, напишите здесь.

просто потому, что я часами искал правильное имя базы данных: имя базы данных-это имя вашего источника данных. Поэтому попробуйте с URL jdbc:hsqldb:mem:dataSource, если у вас есть компонент источника данных с данных. Если это не работает, попробуйте столбцам по умолчанию.

У меня проблема с удаленным подключением H2 версии 1.4.190 к inMemory (а также в файле) с Connection is broken: "unexpected status 16843008" пока не понизится до 1.3.176. См.Grails доступ к H2 TCP-сервер зависает

Статья предназначено прежде всего для новичков, т.к. и сам я не являюсь программистом по своей специальности, и на Java начал программировать совсем недавно.

Мне захотелось написать одну простую программу, в которой использовалось бы встроенная БД. Немного погуглив я вышел на H2. Об этой БД были хорошие отзывы, и в сравнении производительности у нее были хорошие результаты, поэтому ее и выбрал.

Далее у меня появилась проблема как же ее все-таки использовать. Дальше я снова погуглил, и нашел вот это. Здесь правда для NetBeans, в Eclipse я делал по другому. В первую очередь это касается создания таблиц. Далее опишу что у меня получилось.

1. Скачиваем с сайта установочный файл или zip архив. Устанавливаем и распаковываем.

2. Для того чтоб было проще, я скопировал в отдельную папку h2-*.jar из папки bin и папку javadoc из папки docs.

image

3. Далее запускаем Eclipse, создаем новый проект, задаем ему имя и нажимаем Next. В следующем окне выбираем Add External JAR’s и там выбираем наш h2-*.jar. Разворачиваем список появившийся и выбираем Javadoc Location нажав кнопку Edit, выбираем папку javadoc. И жмем Finish.

4. Создаем package и class которые вам нужны. Далее последует код который поможет вам создать базу, таблицу, заполнить ее значениями и получить их.

import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectH2

public static void main(String[] args) try Class.forName("org.h2.Driver").newInstance();
Connection conn = DriverManager.getConnection("jdbc:h2:test",
"sa", "");
Statement st = null;
st = conn.createStatement();
st.execute("INSERT INTO TEST VALUES(default,'HELLO')");
st.execute("INSERT INTO TEST(NAME) VALUES('JOHN')");
String name1 = "Jack";
String q = "insert into TEST(name) values(?)";
PreparedStatement st1 = null;

st1 = conn.prepareStatement(q);
st1.setString(1, name1);
st1.execute();

ResultSet result;
result = st.executeQuery("SELECT * FROM TEST");
while (result.next()) String name = result.getString("NAME");
System.out.println(result.getString("ID")+" "+name);
>
> catch (Exception e) e.printStackTrace();
>
>
>

Вот небольшие комментарии по коду.

В этой строчке я не совсем понял для чего используют newInstance(), в примере на сайте H2 без нее обходятся, но в примере для NetBeanse по ссылке выше пишется вот так. Вроде бы, как я понял помогает избежать каких то исключений.

Connection conn = DriverManager.getConnection("jdbc:h2:test","sa", "");

Первое здесь это путь к файлу с БД. Если написать так, то он создаться в корне с программой (jar файлом, а в случае запуска из Eclipse — в корне проекта), так же можно задать путь в какую-нибудь папку, относительный путь и т.п. Далее идет имя администратора и пароль. Так как я создаю встроенную базу данных, то не стал пока разбираться с пользователями и т.п. После этого должен создаться файл test.h2.db. Так же этот файл можно зашифровать сразу же. В файле H2.pdf есть раздел «Connecting to an Encrypted Database» и там есть пример кода. Так же еще хотелось бы сказать что путь к базе, логин и т.д. имеет смысл вынести в отдельные константы, в данном случае я опять же упростил написание просто.

Назначение переменных Statement и PreparedStatment для меня выглядит одинаковым, просто в случае с PreparedStatment позволяет нам создавать запросы в БД с использованием переменных.
Обратите внимание на:
st1.setString(1, name1);

Здесь идет преобразование переменной к необходимому типу, есть еще setInt и т.д. Здесь 1 — это номер знака вопроса в запросе.

insert into TEST(name) values(?)

Так же существует несколько способов выполнить запрос – execute, executeQuery и executeUpdate, так что стоит про них почитать в javadoc на H2 может вам это и пригодится, мне пока что не нужно было.

Ну и последнее — переменная ResultSet result – судя по описание в ней довольно много чего можно выполнить, мне она пригодилась только для одного вывода из базы данных. Знать надо вот что, result.next() надо сделать в первую очередь, до того как вытаскивать результаты, иначе будет ошибка, изначально переменная result ссылается на строку -1 (если так можно выразиться), а там ничего нет.

В примере для NetBeanse немного по другому написан цикл вывода, с тем вариантом я не разобрался, возникали ошибки, у меня заработал мой вариант.

Так же в реальной программе я это все разделю на отдельные нужные мне функции, и так же не забываем о том что надо еще отсоединиться от базы и закрыть ее: st.close(); и conn.close(); Например это стоит делать в блоке finally после обработки ошибки. Я этого в данном случае не делал.

Как запустить java программу без Eclipse?

Выбираем File-Export, там уже выбираем Java-Runable JAR File, затем Next.
Launch Configuration – выбираем наш проект. Задаем имя выходного файла и его расположение.
Выбираем library handling.
Как я понял первый вариант копируем только необходимый ему код, второй вариант упаковывает все целиком (в нашем случае h2-*.jar), третий вариант – создает поддиректорию, в которой будет располагаться h2-*.jar.
Если вы пишете только для себя то тут думаю неважно какой вариант вы выберите, но если хотите распространять, то по-моему лучше всего третий вариант, или второй, про первый вариант сам Eclipse выдает предупреждение что могут быть проблемы с лицензией. Лицензия на H2 вот тут.

Создали jar файл, теперь нужно его запустить, пишем в консоли:
java –jar test.jar
где test.jar – имя вашего файла.

После установке в Windows, появляются еще ссылки на H2 Console в меню «Пуск». Запускаем одну из них, и должен открыться браузер с формой в которой если вы укажите путь до вашей базы, логин, пароль и т.д. то сможете выполнить какие-либо запросы к вашей базе.

Читайте также: