数据库文件设置
文件加密
数据库文件可以加密。H2支持AES加密算法。为了使用文件加密,需要指定加密算法(参数cipher)和连接到数据库时的文件密码(在用户密码之外)。
可以对数据库文件做加密,通过在URL中指定"CIPHER=AES":
jdbc:h2:<url>;CIPHER=AES
范例:
jdbc:h2:ssl://localhost/~/test;CIPHER=AES
jdbc:h2:file:~/secure;CIPHER=AES
创建一个文件加密的新数据库
默认,如果数据库不存在会自动创建一个新的数据库。为了创建一个加密的数据库,连接它就像它好像已经存在一样。
连接到加密数据库
连接到一个加密后的数据库, 除了设置CIPHER=AES外,还需要在密码字段中设置文件密码,在用户密码前。在文件密码和用户密码之间用一个空格简单分割,因此文件密码是不容许包含空格的。文件密码和用户密码都是大小写敏感。
这里是连接到加密数据库的例子,java代码如下:
Class.forName("org.h2.Driver");
String url = "jdbc:h2:~/test;CIPHER=AES";
String user = "sa";
String pwds = "filepwd userpwd";
conn = DriverManager.getConnection(url, user, pwds);
注意pwds的格式,空格分开,前面是文件密码,后面是用户密码。
TODO:文件密码是哪里设置的?猜测是第一次创建数据库时使用这里的文件密码,之后就依靠这个密码继续访问。
加密或者解密数据库
为了加密一个已经存在的数据库,可以使用ChangeFileEncryption工具。这个工作也同样用于解密数据库,或者修改文件加密的密钥。这个工作在H2的console上的工具区中可以得到,或者你可以在命令行运行它。下面的命令行将加密user home目录下的test数据库,使用文件密码filepwd和AES加密算法:
java -cp h2*.jar org.h2.tools.ChangeFileEncryption -dir ~ -db test -cipher AES -encrypt filepwd
文件加锁方法
H2可以对数据库文件做加锁操作,指定FILE_LOCK:
jdbc:h2:<url>;FILE_LOCK={FILE|SOCKET|FS|NO}
范例:
jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET
细节见H2文档 database_file_locking。
仅当数据库存在时打开
默认情况下,当URL指定的数据库文件不存在时,H2会自动创建文件并打开该数据库。可以通过设置IFEXISTS=TRUE来改变这个行为,仅当指定数据库已经存在时才打开:
jdbc:h2:<url>;IFEXISTS=TRUE
范例:
jdbc:h2:file:~/sample;IFEXISTS=TRUE
细节见文档。
定制文件访问模式
通常,数据库用rw(读写)模式打开数据库文件(除非是只读数据库,那会使用r/只读模式)。为了用只读模式打开一个文件不是只读的数据库,需要设置ACCESS_MODE_DATA=r。也支持rws和rwd。这个设置必须在数据库URL中指明:
String url = "jdbc:h2:~/test;ACCESS_MODE_DATA=rws";
rwd和rws的含义:
- rwd: 文件内容的每个更新都被同步写入底层存储设备.
- rws: 在rwd的基础上,metadata的每个更新都被同步写入.
具体内容参考 H2文档 Durability Problems.
将数据库存放在zip文件中
可以通过这个方式将数据库文件存放在一个zip文件中,虽然不清楚何时适合如此做,格式如下:
jdbc:h2:zip:<zipFileName>!/<databaseName>
范例:
jdbc:h2:zip:~/db.zip!/test