H2數據庫

H2是一個用Java開發的嵌入式數據庫,它自己只是一個類庫,能夠直接嵌入到應用項目中。html

  H2最大的用途在於能夠同應用程序打包在一塊兒發佈,這樣能夠很是方便地存儲少許結構化數據。java

  它的另外一個用途是用於單元測shi。啓動速度快,並且能夠關閉持久化功能,每個用例執行完隨即還原到初始狀態。linux

  H2的第三個用處是做爲緩存,做爲NoSQL的一個補充。當某些場景下數據模型必須爲關係型,能夠拿它當Memcached使,做爲後端MySQL/Oracle的一個緩衝層,緩存一些不常常變化但須要頻繁訪問的數據,好比字典表、權限表。不過這樣系統架構就會比較複雜了。web

 

1、產品優點  sql

  • 純Java編寫,不受平臺的限制;
  • 只有一個jar文件,適合做爲嵌入式數據庫使用;
  • h2提供了一個十分方便的web控制檯用於操做和管理數據庫內容;
  • 功能完整,支持標準SQL和JDBC。麻雀雖小五臟俱全;
  • 支持內嵌模式、服務器模式和集羣。

 

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文件歡快地跑起來數據庫服務。但其實不建議醬紫,由於這樣有諸多不便。可以下修改:

  1. 複製h2.sh爲h2_server.sh文件;

  1. 編輯h2_server.sh,以下:#!/bin/shdir=$(dirname"$0")java -cp "$dir/h2-1.3.176.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Server -tcpAllowOthers -webAllowOthers -webPort 8082"$@"
  2. 說明: 

  org.h2.tools.Server: 以服務器模式啓動 

  -tcpAllowOthers: 容許遠程機器經過TCP方式訪問 

  -webAllowOthers: 容許遠程機器經過瀏覽器訪問 

  -webPort 8082: 默認的訪問端口(8082爲未被佔用的端口,若是此端口已經被其餘端口占用,則改成其餘端口)

  1. 具體的運行方式

  ①chmod修改文件權限;

  ②輸入nohup ./h2_server.sh &回車。這樣能夠後臺運行;

 

4、遠程管理

  1. 經過遠程瀏覽器來訪問h2 

  訪問地址: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
相關文章
相關標籤/搜索