深入理解h2和r2dbc-h2

简介: 深入理解h2和r2dbc-h2

简介


本文将会介绍R2DBC的H2实现r2dbc-h2的使用方法和要注意的事项。一起来看看吧。


H2数据库简介


什么是H2数据库呢?


H2是一个Java SQL database,它是一个开源的数据库,运行起来非常快。


H2流行的原因是它既可以当做一个独立的服务器,也可以以一个嵌套的服务运行,并且支持纯内存形式运行。


H2的jar包非常小,只有2M大小,所以非常适合做嵌套式数据库。


如果作为嵌入式数据库,则需要将h2*.jar添加到classpath中。


下面是一个简单的建立H2连接的代码:


import java.sql.*;
public class Test {
    public static void main(String[] a)
            throws Exception {
        Connection conn = DriverManager.
            getConnection("jdbc:h2:~/test", "sa", "");
        // add application code here
        conn.close();
    }
}


如果给定地址的数据库并不存在,


同时H2还提供了一个简单的管理界面,使用下面的命令就可以启动H2管理界面:


java -jar h2*.jar


默认情况下访问http://localhost:8082就可以访问到管理界面:


image.png

image.png


r2dbc-h2



r2dbc-h2是r2dbc spi的一种实现。同样的使用r2dbc-h2也提供了两种h2的模式,一种是文件系统,一种是内存。


同时还提供了事务支持,prepared statements和batch statements等特性的支持。


r2dbc-h2的Maven依赖



要想使用r2dbc-h2,我们需要添加如下依赖:


<dependency>
  <groupId>io.r2dbc</groupId>
  <artifactId>r2dbc-h2</artifactId>
  <version>${version}</version>
</dependency>


如果你体验snapshot版本,可以添加下面的依赖:


<dependency>
  <groupId>io.r2dbc</groupId>
  <artifactId>r2dbc-h2</artifactId>
  <version>${version}.BUILD-SNAPSHOT</version>
</dependency>
<repository>
  <id>spring-libs-snapshot</id>
  <name>Spring Snapshot Repository</name>
  <url>https://repo.spring.io/libs-snapshot</url>
</repository>


建立连接



h2有两种连接方式,file和内存,我们分别看一下都是怎么建立连接的:


ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:h2:file//my/relative/path");
Publisher<? extends Connection> connectionPublisher = connectionFactory.create();


我们还可以通过ConnectionFactoryOptions来创建更加详细的连接信息:


ConnectionFactoryOptions options = builder()
    .option(DRIVER, "h2")
    .option(PROTOCOL, "...")  // file, mem
    .option(HOST, "…")
    .option(USER, "…")
    .option(PASSWORD, "…")
    .option(DATABASE, "…")
    .build();
ConnectionFactory connectionFactory = ConnectionFactories.get(options);
Publisher<? extends Connection> connectionPublisher = connectionFactory.create();
// Alternative: Creating a Mono using Project Reactor
Mono<Connection> connectionMono = Mono.from(connectionFactory.create());


上面的例子中,我们使用到了driver,protocol, host,username,password和database这几个选项,除此之外H2ConnectionOption中定义了其他可以使用的Option:


public enum H2ConnectionOption {
    /**
     * FILE|SOCKET|NO
     */
    FILE_LOCK,
    /**
     * TRUE|FALSE
     */
    IFEXISTS,
    /**
     * Seconds to stay open or {@literal -1} to to keep in-memory DB open as long as the virtual machine is alive.
     */
    DB_CLOSE_DELAY,
    /**
     * TRUE|FALSE
     */
    DB_CLOSE_ON_EXIT,
    /**
     * DML or DDL commands on startup, use "\\;" to chain multiple commands
     */
    INIT,
    /**
     * 0..3 (0=OFF, 1=ERROR, 2=INFO, 3=DEBUG)
     */
    TRACE_LEVEL_FILE,
    /**
     *  Megabytes (to override the 16mb default, e.g. 64)
     */
    TRACE_MAX_FILE_SIZE,
    /**
     * 0..3 (0=OFF, 1=ERROR, 2=INFO, 3=DEBUG)
     */
    TRACE_LEVEL_SYSTEM_OUT,
    LOG,
    /**
     * TRUE|FALSE
     */
    IGNORE_UNKNOWN_SETTINGS,
    /**
     * r|rw|rws|rwd (r=read, rw=read/write)
     */
    ACCESS_MODE_DATA,
    /**
     * DB2|Derby|HSQLDB|MSSQLServer|MySQL|Oracle|PostgreSQL|Ignite
     */
    MODE,
    /**
     *  TRUE|FALSE
     */
    AUTO_SERVER,
    /**
     * A port number
     */
    AUTO_SERVER_PORT,
    /**
     * Bytes (e.g. 512)
     */
    PAGE_SIZE,
    /**
     * Number of threads (e.g. 4)
     */
    MULTI_THREADED,
    /**
     * TQ|SOFT_LRU
     */
    CACHE_TYPE,
    /**
     * TRUE|FALSE
     */
    PASSWORD_HASH;
}


当然还有最直接的database选项:


r2dbc:h2:file//../relative/file/name
r2dbc:h2:file///absolute/file/name
r2dbc:h2:mem:///testdb


我们还可以通过H2特有的代码H2ConnectionFactory来创建:


H2ConnectionFactory connectionFactory = new H2ConnectionFactory(H2ConnectionConfiguration.builder()
    .inMemory("...")
    .option(H2ConnectionOption.DB_CLOSE_DELAY, "-1")
    .build());
Mono<Connection> connection = connectionFactory.create();


CloseableConnectionFactory connectionFactory = H2ConnectionFactory.inMemory("testdb");
Mono<Connection> connection = connectionFactory.create();


参数绑定



在使用prepare statement的时候,我们需要进行参数绑定:


connection
    .createStatement("INSERT INTO person (id, first_name, last_name) VALUES ($1, $2, $3)")
    .bind("$1", 1)
    .bind("$2", "Walter")
    .bind("$3", "White")
    .execute()


除了$符号绑定之外,还支持index绑定,如下所示:


Statement statement = connection.createStatement("SELECT title FROM books WHERE author = $1 and publisher = $2");
statement.bind(0, "John Doe");
statement.bind(1, "Happy Books LLC");


批处理



我们来看下r2dbc-h2是怎么来进行批处理的:


Batch batch = connection.createBatch();
Publisher<? extends Result> publisher = batch.add("SELECT title, author FROM books")
    .add("INSERT INTO books VALUES('John Doe', 'HappyBooks LLC')")
    .execute();


事务和Savepoint



r2dbc还支持事务和savepoint,我们可以在事务中rollback到特定的savepoint。具体的代码如下:


Publisher<Void> begin = connection.beginTransaction();
Publisher<Void> insert1 = connection.createStatement("INSERT INTO books VALUES ('John Doe')").execute();
Publisher<Void> savepoint = connection.createSavepoint("savepoint");
Publisher<Void> insert2 = connection.createStatement("INSERT INTO books VALUES ('Jane Doe')").execute();
Publisher<Void> partialRollback = connection.rollbackTransactionToSavepoint("savepoint");
Publisher<Void> commit = connection.commit();
相关文章
|
Oracle 关系型数据库 MySQL
如何卸载Linux上的MySQL8.0
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。 本片文章为大家介绍如何卸载MySQL
1099 0
|
存储 JavaScript 前端开发
使用CDN方法的方式进行Vue.js的安装
最近公司需要进行一些前端的开发工作用到了Vue前端框架,所以准备自学Vue,顺便几下学习的过程以及一些问题。
1076 0
使用CDN方法的方式进行Vue.js的安装
|
6月前
|
JSON 数据格式
利用HTTP POST协议实现简单的RPC协议,并使用WireShark进行抓包分析
通过这种方式,我们可以利用HTTP POST实现简单的RPC协议,并使用WireShark进行抓包分析。这种方式简单易懂,实用性强,可以应用于各种网络编程场景。
201 16
|
应用服务中间件 nginx
Docsify——部署后显示404且无法访问README.md
Docsify——部署后显示404且无法访问README.md
181 0
|
Kubernetes API Docker
Kubernetes (k8s 1.23) 安装与卸载
Kubernetes (k8s 1.23) 安装与卸载
338 1
|
JavaScript 前端开发 Java
vue-day01 使用cdn引入使用
文章介绍了Vue.js的基础用法,包括数据绑定、条件渲染、列表渲染、事件处理等。通过示例代码展示了如何使用Mustache语法、v-once指令、v-html指令、v-bind和v-on指令,以及动态参数、修饰符和指令缩写。这些基础知识为初学者提供了Vue.js的使用入门。
vue-day01 使用cdn引入使用
|
数据采集 JavaScript 搜索推荐
ssr(Nuxt+Next.js)
ssr(Nuxt+Next.js)
200 4
|
存储 监控 安全
系统安全深度探索:构建坚不可摧的防御体系
系统安全是数字化时代的重要课题。面对外部威胁、内部漏洞与人为失误以及更新与升级的滞后性等挑战,我们需要构建一套坚不可摧的防御体系。通过强化访问控制与身份验证、定期更新与补丁管理、实施安全审计与监控、加强数据加密与备份、提升用户安全意识与培训以及采用先进的安全技术与工具等关键策略,我们可以有效地提升系统的整体安全性
|
程序员 Windows
程序员必备技能:一键创建windows 服务
该内容是关于在Windows上创建服务的教程。通过一个BAT脚本示例,用户可以将程序设置为开机启动或持续运行的服务。脚本设置了服务名称、显示名和描述,并指定了程序路径和参数。将代码保存为.bat文件,以管理员权限运行,即可创建服务。之后在Windows服务管理中找到并启动该服务。
354 4
|
Java 应用服务中间件 容器
SpringBoot 各种 Web 容器服开启 AccessLog 日志
SpringBoot 各种 Web 容器服开启 AccessLog 日志
488 0