H2是一個用Java開發的嵌入式數據庫,它自己只是一個類庫,能夠直接嵌入到應用項目中。html
H2最大的用途在於能夠同應用程序打包在一塊兒發佈,這樣能夠很是方便地存儲少許結構化數據。java
它的另外一個用途是用於單元測shi。啓動速度快,並且能夠關閉持久化功能,每個用例執行完隨即還原到初始狀態。linux
H2的第三個用處是做爲緩存,做爲NoSQL的一個補充。當某些場景下數據模型必須爲關係型,能夠拿它當Memcached使,做爲後端MySQL/Oracle的一個緩衝層,緩存一些不常常變化但須要頻繁訪問的數據,好比字典表、權限表。不過這樣系統架構就會比較複雜了。web
1、產品優點 sql
2、下載和安裝數據庫
(一)下載windows
H2數據庫下載地址:http://www.h2database.com/html/download.html後端
聰明如你確定會選第二個。Windows、Linux下均可以直接解壓縮就用,符合永遠中二中年開發者的使用習慣。瀏覽器
(二)解壓縮後的目錄結構:緩存
h2
|---bin
| |---h2-1.1.116.jar //H2數據庫的jar包(驅動也在裏面)
| |---h2.bat //Windows控制檯啓動腳本
| |---h2.sh //Linux控制檯啓動腳本
| |---h2w.bat //Windows控制檯啓動腳本(不帶黑屏窗口)
|---docs //H2數據庫的幫助文檔(內有H2數據庫的使用手冊)
|---service //經過wrapper包裝成服務。
|---src //H2數據庫的源代碼
|---build.bat //windows構建腳本
|---build.sh //linux構建腳本
此時就算「安裝」完成了。
3、運行模式與運行方式
(一)運行模式
H2有三種運行模式。
1、內嵌模式(Embedded Mode)
內嵌模式下,應用和數據庫同在一個JVM中,經過JDBC進行鏈接。 可持久化,但同時只能一個客戶端鏈接。內嵌模式性能會比較好。
2、服務器模式(Server Mode)
使用服務器模式和內嵌模式同樣,只不過它能夠跑在另外一個進程裏。
3、 混合模式
第一個應用之內嵌模式啓動它,對於後面的應用來講它是服務器模式跑着的。混合模式是內嵌模式和服務器模式的組合。第一個應用經過內嵌模式與數據庫創建鏈接,同時也做爲一個服務器啓動,因而另外的應用(運行在不一樣的進程或是虛擬機上)能夠同時訪問一樣的數據。第一個應用的本地鏈接與嵌入式模式的鏈接性能同樣的快,而其它鏈接理論上會略慢。
(二)運行方式
開發中確定是Server Mode方便,由於須要用工具管理數據。因此進入H2的bin目錄。
若是你在Win環境能夠運行h2.bat或h2w.bat。區別只是後者是後臺靜默運行。
若是你在Linux環境,可運行./h2.sh文件歡快地跑起來數據庫服務。但其實不建議醬紫,由於這樣有諸多不便。可以下修改:
org.h2.tools.Server: 以服務器模式啓動
-tcpAllowOthers: 容許遠程機器經過TCP方式訪問
-webAllowOthers: 容許遠程機器經過瀏覽器訪問
-webPort 8082: 默認的訪問端口(8082爲未被佔用的端口,若是此端口已經被其餘端口占用,則改成其餘端口)
①chmod修改文件權限;
②輸入nohup ./h2_server.sh &回車。這樣能夠後臺運行;
4、遠程管理
訪問地址:http://服務器ip:8082/ ,出現以下頁面:
2.路徑的配置
jdbc:h2:tcp://localhost//usr/h2/data/rlib 是H2的路徑。tcp表明使用tcp方式訪問。localhost/是IP。由於例子是在Linux下,數據庫的文件路徑是「/usr/h2/data/rlib」,因此localhost/後面還有個/。詳細的URL設置可見本文附錄。(聰明如你,可能會問爲何既然H2遠程部署在Linux下但使用瀏覽器訪問IP還填寫localhost?就不告訴你)
User name : sa是h2默認的用戶,密碼可空。但做爲永遠中二隨性的中年開發者,好歹設置下密碼,尤爲當你的H2部署在公網時。否則會被無聊人把數據刪到汗褲都不剩。
3.點擊如圖Test connect按鈕測shi鏈接。此時若是數據庫文件自己不存在則會自動建立。數據庫文件自動生成到/usr/h2/data/目錄下,名爲rlib.mv.db。點擊Connect,進入管理終端。
H2的管理終端作得很不錯的。按Ctrl+Enter執行輸入區的SQL,按Shift+Enter執行當前選中的SQL。
5、數據備份恢復
不能備份和導入數據的數據庫是跛腳的。可經過自帶的CSVWRITE方法導出爲csv格式文件,也可經過CSVREAD 導入數據。
(一)導出函數CSVWRITE
例子:CALL CSVWRITE('test2.csv', 'SELECT * FROM TEST', 'charset=UTF-8 fieldSeparator=|');
注意:導出時就算加上編碼,導出後的文件用VIM、Editplus查看是正常,但用Excel查看也仍然會是亂碼的。須要用Editplus另存爲Unicode,就行了。
(二)導入函數CSVWRITE
語法:CSVREAD(fileNameString [, columnsString [, csvOptions ] ] )
例子①:導入數據:INSERT INTO TEST ( SELECT * FROM CSVREAD('d:/test.csv ')) ;
例子②:導入結構及數據,根據csv文件建立h2數據表。
//csv文件數據建立test表
CREATE TABLE TEST AS SELECT * FROM CS VREAD('d:/test.csv ');
//建立test表,csv文件相應的列插入到test表相應的字段
CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255)) AS SELECT * FROM CSVREAD('d:/test.csv ');
(三)csvOptions
6、應用程序開發
終於到了開發使用環節了。H2數據庫的開發很是簡單,和MySQL等沒有太大區別。
(一)加入Maven依賴
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.195</version>
</dependency>
(二)建立db.properties
driverClassName=org.h2.Driver
#此處的寫法是使用嵌入模式連接H2庫,緊接着那行是使用Server Mode用tcp鏈接。區別一個是前者性能更好,後者可同時多個客戶端鏈接
url=jdbc:h2:D:/test
#url=jdbc:h2:tcp://1localhost//usr/h2/data/rlib
username=sa
password=
PS:在使用嵌入模式連接H2庫時,使用管理頁面鏈接會報錯以下:
(三)使用如上db.properties便可使用H2數據庫進行開發。具體的數據庫操做等不屬於H2範疇,可自行參kao其它資料。
附錄:H2數據庫不一樣模式鏈接字串
URL Format and Examples | |
Embedded (local) connection | jdbc:h2:[file:][<path>]<databaseName> jdbc:h2:~/test jdbc:h2:file:/data/sample jdbc:h2:file:C:/data/sample (Windows only) |
In-memory (private) | jdbc:h2:mem: |
In-memory (named) | jdbc:h2:mem:<databaseName> jdbc:h2:mem:test_mem |
Server mode (remote connections) using TCP/IP | jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName> jdbc:h2:tcp://localhost/~/test jdbc:h2:tcp://dbserv:8084/~/sample jdbc:h2:tcp://localhost/mem:test |
Server mode (remote connections) using TLS | jdbc:h2:ssl://<server>[:<port>]/<databaseName> jdbc:h2:ssl://localhost:8085/~/sample; |
Using encrypted files | jdbc:h2:<url>;CIPHER=AES jdbc:h2:ssl://localhost/~/test;CIPHER=AES jdbc:h2:file:~/secure;CIPHER=AES |
File locking methods | jdbc:h2:<url>;FILE_LOCK={FILE|SOCKET|NO} jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET |
Only open if it already exists | jdbc:h2:<url>;IFEXISTS=TRUE jdbc:h2:file:~/sample;IFEXISTS=TRUE |
Don't close the database when the VM exits | jdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE |
Execute SQL on connection | jdbc:h2:<url>;INIT=RUNSCRIPT FROM '~/create.sql' jdbc:h2:file:~/sample;INIT=RUNSCRIPT FROM '~/create.sql'\;RUNSCRIPT FROM '~/populate.sql' |
User name and/or password | jdbc:h2:<url>[;USER=<username>][;PASSWORD=<value>] jdbc:h2:file:~/sample;USER=sa;PASSWORD=123 |
Debug trace settings | jdbc:h2:<url>;TRACE_LEVEL_FILE=<level 0..3> jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3 |
Ignore unknown settings | jdbc:h2:<url>;IGNORE_UNKNOWN_SETTINGS=TRUE |
Custom file access mode | jdbc:h2:<url>;ACCESS_MODE_DATA=rws |
Database in a zip file | jdbc:h2:zip:<zipFileName>!/<databaseName> jdbc:h2:zip:~/db.zip!/test |
Compatibility mode | jdbc:h2:<url>;MODE=<databaseType> jdbc:h2:~/test;MODE=MYSQL |
Auto-reconnect | jdbc:h2:<url>;AUTO_RECONNECT=TRUE jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE |
Automatic mixed mode | jdbc:h2:<url>;AUTO_SERVER=TRUE jdbc:h2:~/test;AUTO_SERVER=TRUE |
Page size | jdbc:h2:<url>;PAGE_SIZE=512 |
Changing other settings | jdbc:h2:<url>;<setting>=<value>[;<setting>=<value>...] jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3 |