База данных в памяти — введение и практика H2

задняя часть база данных сервер встроенный

1. Введение в базу данных H2

Адрес базы данных H2:Woohoo. Также 2database.com/HTML/show off. Также…

H2 — это встроенный (не встроенный в устройство) движок базы данных с открытым исходным кодом, представляющий собой библиотеку классов, разработанную на Java, которая может быть непосредственно встроена в приложение, упакована и выпущена вместе с приложением и не ограничена платформой.​

  • 1.1 Сравнение с другими базами данных с открытым исходным кодом

    H2 по сравнению с Derby, HSQLDB, MySQL, PostgreSQL и другими базами данных с открытым исходным кодом, преимущества H2: вклад разработчиков Java, независимый от платформы, b.H2 только пакет JAR, небольшой размер, подходит для встроенной базы данных, c.. есть представляют собой веб-консоль для базы данных управления трубками. Конкретные характеристики следующие:

особенность H2 Derby HSQLDB MySQL PostgreSQL
чистая Java yes yes yes no no
Поддержка режима памяти yes yes yes no no
Поддержка шифрования базы данных yes yes yes no no
Поддержка драйвера ODBC yes no no yes yes
Поддержка Полный текстовый поиск yes no no yes yes
Он поддерживает многоправильный контроль параллелизма yes no yes yes yes
Занятое пространство (jar/dll) ~1M ~2M ~1M ~4M ~6M

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

База данных H2 поддерживает следующие три метода подключения:

Способ подключения описывать
Встроенный режим локальное соединение JDBC
режим сервера Удаленное соединение ODBC на основе JDBC или tcp/ip
режим смешивания Локальные или удаленные одновременные соединения

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

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

Встроенный режим — самый простой и быстрый метод подключения.В встроенном режиме приложение запускает базу данных H2 в JVM и подключается через JDBC. Этот режим поддерживает как сохраняемость данных, так и содержимое, и нет ограничений на количество баз данных и соединений с базами данных, которые могут быть открыты одновременно. Схематическая диаграмма выглядит следующим образом:

这里写图片描述

режим сервера

В режиме сервера приложение удаленно открывает базу данных через JDBC или ODBC API. В этом режиме база данных H2 может быть развернута на разных JVM или разных физических машинах, и несколько приложений могут одновременно подключаться к базе данных H2, подключаясь к серверу H2. Поскольку данные необходимо передавать удаленно по протоколу TCP/IP, режим сервера медленнее, чем встроенный режим для получения данных. Принципиальная схема режима сервера выглядит следующим образом:

这里写图片描述

режим смешивания

Гибридный режим сочетает в себе функции встроенного режима и режима сервера.Первое приложение открывает базу данных H2 через встроенный режим, и в то же время база данных включается в режим сервера, а другие приложения могут подключаться к базу данных удаленно. Запуск и завершение работы сервера базы данных выполняется в первом приложении. Принципиальная схема смешанного режима выглядит следующим образом:

这里写图片描述

  • 1.3 Формат URL JDBC базы данных H2

    База данных H2 поддерживает различные методы подключения и параметры подключения.Формат URL-адреса подключения следующий, а настройки в URL-адресе не чувствительны к регистру.

тема формат URL пример
локальное встроенное соединение jdbc:h2:[file:][]< databaseName> jdbc:h2:~/test
jdbc:h2:file:/data/sample
jdbc:h2:file:C:/data/sample (Windows only)
Режим памяти (частный) jdbc:h2:mem:
режим памяти (имя) jdbc:h2:mem:< databaseName> jdbc:h2:mem:test_mem
Режим сервера (TCP/IP) jdbc:h2:tcp://[:]/[]< databaseName> jdbc:h2:tcp://localhost/~/test
jdbc:h2:tcp://dbserv:8084/~/sample
jdbc:h2:tcp://localhost/mem:test
Режим сервера (TLS) jdbc:h2:ssl://[:]/< databaseName> jdbc:h2:ssl://localhost:8085/~/sample;
Шифрование jdbc:h2:< url>;CIPHER=AES jdbc:h2:ssl://localhost/~/test;CIPHER=AES
jdbc:h2:file:~/secure;CIPHER=AES
блокировка документов jdbc:h2:< url>;FILE_LOCK={FILE|SOCKET|NO} jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET
Открыть, только если он существует jdbc:h2:< url>;IFEXISTS=TRUE jdbc:h2:file:~/sample;IFEXISTS=TRUE
Не закрывать базу данных, пока существует виртуальная машина jdbc:h2:< url>;DB_CLOSE_ON_EXIT=FALSE
Имя пользователя Пароль jdbc:h2:< url>[;USER=< username>][;PASSWORD=< value>] jdbc:h2:file:~/sample;USER=sa;PASSWORD=123
Параметры журнала отладки jdbc:h2:< url>;TRACE_LEVEL_FILE=< level 0..3> jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3
Игнорировать неизвестные настройки jdbc:h2:;IGNORE_UNKNOWN_SETTINGS=TRUE
Доступ к пользовательскому файлу jdbc:h2:;ACCESS_MODE_DATA=rws
файл базы данных в формате zip jdbc:h2:zip:< zipFileName>!/< databaseName> jdbc:h2:zip:~/db.zip!/test
Режим совместимости jdbc:h2:< url>;MODE=< databaseType> jdbc:h2:~/test;MODE=MYSQL
автоматическое переподключение jdbc:h2:< url>;AUTO_RECONNECT=TRUE jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE
Автоматический режим наложения jdbc:h2:< url>;AUTO_SERVER=TRUE jdbc:h2:~/test;AUTO_SERVER=TRUE
размер страницы jdbc:h2:< url>;PAGE_SIZE=512
Изменить другие настройки JDBC: H2: ; = [; = ...] jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3

2. Консоль базы данных H2

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

这里写图片描述

Консоль H2 имеет разные способы запуска под разными операционными системами.Система автора - Mac os.Запускается через командную строку следующим образом:

java -jar h2*.jar

После запуска сервера базы данных H2 автоматически откроется веб-консоль, или вы можете использовать:http://localhost:8082доступ. Интерфейс консоли выглядит следующим образом:

这里写图片描述

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

这里写图片描述

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

3. Практика базы данных H2

Соответствующая ссылка на конфигурацию базы данных Spring+Mybatis+Mysql:Spring управление транзакциями — программные транзакции, декларативные транзакции, В этой статье представлена ​​практика доступа к базе данных Spring+Mybatis+H2. Конфигурацию Spring+Mybatis см. в предыдущей статье Это событие добавляет зависимости базы данных H2:

...
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.190</version>
        </dependency>
...

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

driver=org.h2.Driver
# 内存模式
url=jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1
# 持久化模式
#url= jdbc:h2:tcp://localhost/~/test1;MODE=MYSQL;DB_CLOSE_DELAY=-1

Файл конфигурации Spring для доступа к базе данных H2:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
            http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
            http://www.springframework.org/schema/jdbc
                http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">

    <!-- 引入属性文件 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config.properties</value>
            </list>
        </property>
    </bean>

    <!-- 自动扫描DAO -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xiaofan.test" />
    </bean>

    <!-- 配置Mybatis sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis_config.xml"/>
        <property name="mapperLocations" value="classpath:user_mapper.xml"/>
    </bean>

    <!-- 配置数据源 -->
    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <!--<property name="username" value="sa" />-->
        <!--<property name="password" value="123" />-->
    </bean>

    <!-- 初始化数据库 -->
    <jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS">
        <jdbc:script location="classpath:sql/ddl.sql" />
        <jdbc:script location="classpath:sql/dml.sql" />
    </jdbc:initialize-database>

    <!-- 配置事务管理 -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>

Файл оператора DDL для инициализации базы данных:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

Файл оператора DML для инициализации базы данных:

insert into `user` (`id`,`name`,`age`) values (1, 'Jerry', 27);
insert into `user` (`id`,`name`,`age`) values (2, 'Angel', 25);

Напишите тестовый файл следующим образом:

/**
 * Created by Jerry on 17/7/30.
 */
@ContextConfiguration(locations = {"classpath:config.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class Test extends AbstractJUnit4SpringContextTests{

    @Resource
    UserDAO userDAO;

    @org.junit.Test
    public void testInsert() {

        int result = userDAO.insert(new User(null, "LiLei", 27));

        Assert.assertTrue(result > 0);
    }

    @org.junit.Test
    public void testUpdate() {
        int result = userDAO.update(new User(2L, "Jerry update", 28));

        Assert.assertTrue(result > 0);
    }

    @org.junit.Test
    public void testSelect() {
        User result = userDAO.findByName(new User(null, "Jerry", null));

        Assert.assertTrue(result.getAge() != null);
    }

    @org.junit.Test
    public void testDelete() {
        int result = userDAO.delete("Jerry");

        Assert.assertTrue(result > 0);
    }

}

Результат теста пройден!