日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解h2和r2dbc-h2

發(fā)布時(shí)間:2024/2/28 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解h2和r2dbc-h2 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 簡介
  • H2數(shù)據(jù)庫簡介
  • r2dbc-h2
  • r2dbc-h2的Maven依賴
  • 建立連接
  • 參數(shù)綁定
  • 批處理
  • 事務(wù)和Savepoint

簡介

本文將會介紹R2DBC的H2實(shí)現(xiàn)r2dbc-h2的使用方法和要注意的事項(xiàng)。一起來看看吧。

H2數(shù)據(jù)庫簡介

什么是H2數(shù)據(jù)庫呢?

H2是一個(gè)Java SQL database,它是一個(gè)開源的數(shù)據(jù)庫,運(yùn)行起來非常快。

H2流行的原因是它既可以當(dāng)做一個(gè)獨(dú)立的服務(wù)器,也可以以一個(gè)嵌套的服務(wù)運(yùn)行,并且支持純內(nèi)存形式運(yùn)行。

H2的jar包非常小,只有2M大小,所以非常適合做嵌套式數(shù)據(jù)庫。

如果作為嵌入式數(shù)據(jù)庫,則需要將h2*.jar添加到classpath中。

下面是一個(gè)簡單的建立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 hereconn.close();} }

如果給定地址的數(shù)據(jù)庫并不存在,

同時(shí)H2還提供了一個(gè)簡單的管理界面,使用下面的命令就可以啟動H2管理界面:

java -jar h2*.jar

默認(rèn)情況下訪問http://localhost:8082就可以訪問到管理界面:

r2dbc-h2

r2dbc-h2是r2dbc spi的一種實(shí)現(xiàn)。同樣的使用r2dbc-h2也提供了兩種h2的模式,一種是文件系統(tǒng),一種是內(nèi)存。

同時(shí)還提供了事務(wù)支持,prepared statements和batch statements等特性的支持。

r2dbc-h2的Maven依賴

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

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

如果你體驗(yàn)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和內(nèi)存,我們分別看一下都是怎么建立連接的:

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

我們還可以通過ConnectionFactoryOptions來創(chuàng)建更加詳細(xì)的連接信息:

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這幾個(gè)選項(xiàng),除此之外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; }

當(dāng)然還有最直接的database選項(xiàng):

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

我們還可以通過H2特有的代碼H2ConnectionFactory來創(chuàng)建:

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();

參數(shù)綁定

在使用prepare statement的時(shí)候,我們需要進(jìn)行參數(shù)綁定:

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是怎么來進(jìn)行批處理的:

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();

事務(wù)和Savepoint

r2dbc還支持事務(wù)和savepoint,我們可以在事務(wù)中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();

本文作者:flydean程序那些事

本文鏈接:http://www.flydean.com/r2dbc-h2-in-depth/

本文來源:flydean的博客

歡迎關(guān)注我的公眾號:「程序那些事」最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!

總結(jié)

以上是生活随笔為你收集整理的深入理解h2和r2dbc-h2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。