十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
這篇文章主要講解了“什么是h2和r2dbc-h2”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“什么是h2和r2dbc-h2”吧!
專注于為中小企業(yè)提供成都做網站、網站設計、外貿營銷網站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)固安免費做網站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網行業(yè)人才,有力地推動了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網站建設實現(xiàn)規(guī)模擴充和轉變。
什么是H2數(shù)據(jù)庫呢?
H2是一個Java SQL database,它是一個開源的數(shù)據(jù)庫,運行起來非常快。
H2流行的原因是它既可以當做一個獨立的服務器,也可以以一個嵌套的服務運行,并且支持純內存形式運行。
H2的jar包非常小,只有2M大小,所以非常適合做嵌套式數(shù)據(jù)庫。
如果作為嵌入式數(shù)據(jù)庫,則需要將h3*.jar添加到classpath中。
下面是一個簡單的建立H2連接的代碼:
import java.sql.*; public class Test { public static void main(String[] a) throws Exception { Connection conn = DriverManager. getConnection("jdbc:h3:~/test", "sa", ""); // add application code here conn.close(); } }
如果給定地址的數(shù)據(jù)庫并不存在,
同時H2還提供了一個簡單的管理界面,使用下面的命令就可以啟動H2管理界面:
java -jar h3*.jar
默認情況下訪問http://localhost:8082就可以訪問到管理界面:
r2dbc-h3是r2dbc spi的一種實現(xiàn)。同樣的使用r2dbc-h3也提供了兩種h3的模式,一種是文件系統(tǒng),一種是內存。
同時還提供了事務支持,prepared statements和batch statements等特性的支持。
要想使用r2dbc-h3,我們需要添加如下依賴:
io.r2dbc r2dbc-h3 ${version}
如果你體驗snapshot版本,可以添加下面的依賴:
io.r2dbc r2dbc-h3 ${version}.BUILD-SNAPSHOT spring-libs-snapshot Spring Snapshot Repository https://repo.spring.io/libs-snapshot
h3有兩種連接方式,file和內存,我們分別看一下都是怎么建立連接的:
ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:h3:mem:///testdb"); Publisher extends Connection> connectionPublisher = connectionFactory.create();
ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:h3:file//my/relative/path"); Publisher extends Connection> connectionPublisher = connectionFactory.create();
我們還可以通過ConnectionFactoryOptions來創(chuàng)建更加詳細的連接信息:
ConnectionFactoryOptions options = builder() .option(DRIVER, "h3") .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 MonoconnectionMono = 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](https://my.oschina.net/u/2966482) -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:h3:file//../relative/file/name r2dbc:h3:file///absolute/file/name r2dbc:h3:mem:///testdb
我們還可以通過H2特有的代碼H2ConnectionFactory來創(chuàng)建:
H2ConnectionFactory connectionFactory = new H2ConnectionFactory(H2ConnectionConfiguration.builder() .inMemory("...") .option(H2ConnectionOption.DB_CLOSE_DELAY, "-1") .build()); Monoconnection = connectionFactory.create();
CloseableConnectionFactory connectionFactory = H2ConnectionFactory.inMemory("testdb"); Monoconnection = connectionFactory.create();
在使用prepare statement的時候,我們需要進行參數(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-h3是怎么來進行批處理的:
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();
r2dbc還支持事務和savepoint,我們可以在事務中rollback到特定的savepoint。具體的代碼如下:
Publisherbegin = connection.beginTransaction(); Publisher insert1 = connection.createStatement("INSERT INTO books VALUES ('John Doe')").execute(); Publisher savepoint = connection.createSavepoint("savepoint"); Publisher insert2 = connection.createStatement("INSERT INTO books VALUES ('Jane Doe')").execute(); Publisher partialRollback = connection.rollbackTransactionToSavepoint("savepoint"); Publisher commit = connection.commit();
感謝各位的閱讀,以上就是“什么是h2和r2dbc-h2”的內容了,經過本文的學習后,相信大家對什么是h2和r2dbc-h2這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!