H2 Database

找到 jar

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.196</version>
</dependency>

我们首先找到对应的 jar 信息,比如我的路径时:

~\.m2\repository\com\h2database\h2\1.4.196\h2-1.4.196.jar

启动方式

我们首先到这个路径下面,然后执行命令:

java -cp h2-1.4.196.jar org.h2.tools.Shell

进入命令行模式

测试

λ java -cp h2-1.4.196.jar org.h2.tools.Shell

Welcome to H2 Shell 1.4.196 (2017-06-10)
Exit with Ctrl+C
[Enter]   jdbc:h2:~/test
URL
[Enter]   org.h2.Driver
Driver
[Enter]
User
[Enter]   Hide
Password
Password
Connected
Commands are case insensitive; SQL statements end with ';'
help or ?      Display this help
list           Toggle result list / stack trace mode
maxwidth       Set maximum column width (default is 100)
autocommit     Enable or disable autocommit
history        Show the last 20 statements
quit or exit   Close the connection and exit

sql> show databases;
SCHEMA_NAME
INFORMATION_SCHEMA
PUBLIC
(2 rows, 25 ms)
sql> quit;
Connection closed

默认情况下,不允许通过TCP连接或Web界面远程创建数据库。

出于安全原因,不建议启用数据库的远程创建。

创建新数据库的用户将成为其管理员,因此与H2拥有对JVM的相同访问权限,与Java和系统帐户允许的对操作系统的访问权限相同。

建议使用嵌入式URL,本地H2控制台或Shell工具在本地创建所有数据库。

如果确实需要允许远程数据库创建,则可以将-ifNotExists参数传递给TCP,PG或Web服务器(但不能传递给控制台工具)。

它与-tcpAllowOthers,-pgAllowOthers或-webAllowOthers的组合有效地在您的系统中创建了一个远程安全漏洞,如果使用它,请始终使用防火墙或其他解决方案来保护您的端口并使用此类设置组合仅在受信任的网络中。

H2 Servlet也支持此类选项。

关闭

java -cp h2-1.4.196.jar org.h2.tools.Server -tcpShutdown tcp://localhost:9092
Shutting down TCP Server at tcp://localhost:9092

报错

密码错误

可能会有如下报错:

SQL Exception: Wrong user name or password [28000-196]

这个可能是我第一次全部选择的默认选项,登录时全部选择默认选项即可。

java 启动报错

org.h2.jdbc.JdbcSQLException: Database may be already in use: null. Possible solutions: close all other connection(s); use the server mode [90020-196]
...
Caused by: java.lang.IllegalStateException: The file is locked: nio:~/test.mv.db [1.4.196/7]

一开始以为不为创建文件,实际上还是会创建文件的。

windows 安装

下载地址

https://h2database.com/h2-setup-2019-03-13.exe

安装

直接双击安装

启动

然后打开 h2 console

会自动打开浏览器页面:

http://172.17.160.1:8082/test.do?jsessionid=16320cc946bf083325e7b0a902658bf9

输入账户密码就可以进行登录。

使用

登录后的界面就是一个浏览器客户端,暂时不做过多介绍。

服务端启动

启动命令

λ java -cp h2-1.4.196.jar org.h2.tools.Shell

Welcome to H2 Shell 1.4.196 (2017-06-10)
Exit with Ctrl+C
[Enter]   jdbc:h2:tcp://localhost/~/test
URL       jdbc:h2:~/test
[Enter]   org.h2.Driver
Driver    org.h2.Driver
[Enter]
User
[Enter]   Hide
Password
Password
Connected
Commands are case insensitive; SQL statements end with ';'
help or ?      Display this help
list           Toggle result list / stack trace mode
maxwidth       Set maximum column width (default is 100)
autocommit     Enable or disable autocommit
history        Show the last 20 statements
quit or exit   Close the connection and exit

sql> CREATE Table test(NAME VARCHAR)
...> ;
(Update count: 0, 2 ms)
sql> INSERT INTO test VALUES('Hello H2DB!');
(Update count: 1, 0 ms)
sql> quit
Connection closed

这个时候,h2 会在后台运行。

如果你想关闭,使用我们的命令即可:

java -cp h2-1.4.196.jar org.h2.tools.Server -tcpShutdown tcp://localhost:9092
Shutting down TCP Server at tcp://localhost:9092

java 连接

我们上一节是直接通过内存启动的,现在我们让 h2 服务端启动,java 客户端连接。

和常规的 mysql 等数据库类似。

package com.github.houbb.h2.learn.p1;

import java.sql.*;

/**
 * @author binbin.hou
 * @since 1.0.0
 */
public class DefaultServerTest {

    public static void main(String[] args) throws ClassNotFoundException {
        Class.forName("org.h2.Driver");

        try (Connection connection = DriverManager.getConnection("jdbc:h2:~/test", null, null);
             Statement statement = connection.createStatement()) {
            try (ResultSet result = statement.executeQuery("SELECT NAME FROM test")) {
                while (result.next()) {
                    System.out.println(result.getString("name"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

输出日志:

Hello H2DB!

csv 读写

读取

SELECT * FROM CSVREAD('user.csv');

小结

h2 databse 非常的轻量小巧,值得学习一波。

为后续自己手写一个简易版 h2 做准备。