zoukankan      html  css  js  c++  java
  • 无聊的笔记:之三(使用H2内嵌式数据库)

    简介

    H2数据库是一个纯用java开发的开源数据库。只有一个类库(即只有一个2M大小的 jar 文件),可以直接嵌入到应用项目中。

    已经了解并决定使用H2的小伙伴请跳过这里瞎扯,直接看到下面 使用h2数据库

    H2数据库有很多优点,官网是这么说的:

    • Very fast, open source, JDBC API(速度贼拉快,开源免费可以白嫖,支持JDBC)
    • Embedded and server modes; in-memory databases(可以当作内嵌数据库来使用,像Sqlite那样;可以当作客户-服务端数据库来使用,像MySql、Postgresql那样;可以当作内存/缓存数据库)
    • Browser based Console application(支持浏览器的控制台应用,不用额外安装任何桌面应用程序。)
    • Small footprint: around 2 MB jar file size(只要一个2MB大小的jar包就可以使用)

    H2数据库特性

    下面表格内的数据来自官网:https://h2database.com/html/main.html

    H2 Derby HSQLDB MySQL PostgreSQL
    Pure Java Yes Yes Yes No No
    Memory Mode Yes Yes Yes No No
    Encrypted Database Yes Yes Yes No No
    ODBC Driver Yes No No Yes Yes
    Fulltext Search Yes No No Yes Yes
    Multi Version Concurrency Yes No Yes Yes Yes
    Footprint (embedded) ~2 MB ~3 MB ~1.5 MB 不支持 不支持
    Footprint (client) ~500 KB ~600 KB ~1.5 MB ~1 MB ~700 KB

    为什么要使用 H2 ?

    在java开发的时候尤其还在测试阶段,再安装其他的数据库比较麻烦。这时候可以使用 H2 数据库来临时代替那些 OracleMySqlPostgresql 等主流的数据库,因为他只需要导入一个 jar 包就能用了。

    或者你要开发的程序规模不是很大,最多几十万的数据量,这时候 H2 的性能也完全可以 hold 住。

    还有一个好处就是 H2 数据库提供了一个网页版的数据库管理工具。如果只使用简单的 SQL 语句,可以省去安装 navicatphpMyAdmin 这类软件。(这个小工具还挺好用,不仅能链接h2数据库,还能链接 MySql、Postgresql、SQLLite等多种数据库)

    他长下面那样:

    h2数据库数据管理工具
    h2数据库数据管理工具

    总之,方便就是了。

    H2的几种使用方式

    1. 嵌入式模式(使用 JDBC 的本地连接)
      类似HSQLDB、Derby、SQLite等可以集成到程序中,而不要安装额外的数据库软件。

    2. 服务器模式(使用 JDBC 或 ODBC 在 TCP/IP 上的远程连接)

    3. 混合模式(本地和远程连接同时进行)

    应用场景总结

    • 可以同应用程序打包在一起发布,在储存的数据量不大的情况下,避免再安装其他数据库等繁琐的操作。
    • 可用于单元测试。
    • 可以用作缓存,即当做内存数据库,。

    H2数据库与其他主流数据库性能比较

    以下测试内容来自官方测试数据。下面的表格分别将H2与其他数据的运行时间和系统内存使用情况进行了对比测试。
    数据只有部分内容,查看完整内容请至:https://h2database.com/html/performance.html

    内嵌数据库之间的较量(对比的HSQLDB和Derby两个数据库也都是用java开发的嵌入式数据库):

    测试内容 单位 H2数据库 HSQLDB数据库 Derby数据库
    Simple: Init ms 1019 1907 8280
    Simple: Query (random) ms 1304 873 1912
    Simple: Query (sequential) ms 835 1839 5415
    Simple: Update (sequential) ms 961 2333 21759
    Simple: Delete (sequential) ms 950 1922 32016
    Simple: Memory Usage MB 21 10 8

    客户-服务端数据库之间的较量:

    测试内容 单位 H2(Server模式) HSQLDB数据库 Derby数据库 PostgreSQL数据库 MySql数据库
    Simple: Init ms 16338 17198 27860 30156 29409
    Simple: Query (random) ms 3399 2582 6190 3315 3342
    Simple: Query (sequential) ms 21841 18699 42347 30774 32611
    Simple: Update (sequential) ms 6913 7745 28576 32698 11350
    Simple: Delete (sequential) ms 8051 9751 42202 44480 16555
    Simple: Memory Usage MB 22 11 9 0 1

    H2数据库还是有缺点的。比如从上面就可以看出来内存使用明显比其他的要多,而且据说在以前的版本中出现过数据丢失的或者损坏的情况,但是stackoverflow上的大佬说1.2.147版本以后,就没发生过数据损坏或者缺失的情况(没亲身测试过,但是现在都1.4+版本了,因该不会有什么问题)。

    H2相关链接

    使用H2数据库

    1. 下载安装

    • 下载安装 H2
      官网地址:https://h2database.com/html/download.html

      在下载页面有下面两个 下载 选项:

      Version 1.4.200 (2019-10-14)
      -------------------------------------------------------------------------------------------
      Windows Installer (SHA1 checksum: 12710a463318cf23c0e0e3f7d58a0f232bd39cfe)
      Platform-Independent Zip (SHA1 checksum: 5898966bbca0b29ee02602fb84e0eb90ec92eec2)
      ......
      

      第一个是windows的安装程序。第二个是一个压缩包,相当于“绿色版”,无需安装。

      这里下载第二个。

    • 目录介绍
      将下载的zip包解压后得到以下目录结构(现在是2020-10,使用的是2019-10-14 1.4.200 版本,以后或者其他版本可能会有不同)。

      |- bin
         |- h2.bat
         |- h2w.bat
         |- h2.sh
         |- h2-1.4.200.jar
      |- docs
      |- service
      |- src
      |- build.bat
      |- build.sh
      

      说明:
      docs : 是H2说明文档的离线版本,里面都是些 html/pdf 之类的文件。
      service : 通过wrapper包装成服务相关文件。
      src : H2数据库的源代码
      build.bat : windows构建脚本
      build.sh : linux构建脚本
      bin -> h2.bat : windows启动脚本(启动时会有个黑窗口在那里)
      bin -> h2w.bat : windows启动脚本,后台静默启动(启动后没有黑窗口)
      bin -> h2.sh : linux启动脚本
      bin -> h2-1.4.200.jar : 打包好的jar包。如果想要嵌入到你的程序中,只要引入这个jar就可以了(或者使用maven/gradle等)。

    2. 使用 H2 Shell 工具启动数据库。

    在 bin 目录下运行java -cp h2-xxx.jar org.h2.tools.Shell,只要根据引导程序,就可以一步一步的创建数据库。

    如下:

    PS C:h2in> java -cp .h2-1.4.200.jar org.h2.tools.Shell
    
    Welcome to H2 Shell 1.4.200 (2019-10-14)
    Exit with Ctrl+C
    [Enter]   jdbc:h2:~/test
    URL
    [Enter]   org.h2.Driver
    Driver
    [Enter]   sa
    User
    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> select * from test
    ...
    

    上面的操作中,创建 test 数据库。 JDBC URL链接方式为:jdbc:h2:~/test。这会在用户目录下生成一个 test.mv.db 文件,这个文件就是数据库文件。并设置数据库管理员为 sa ,密码为空(只有本地模式,才支持空密码)。

    如果不想将数据库文件创建在用户目录下,可以使用jdbc:h2:[file:][<path>]<databaseName>格式指定数据库保存路径。

    如果要直接在内存中创建数据库,而将数据持久化到本地保存,则使用 jdbc:h2:mem:<databaseName> 格式。

    H2还支持其他Database URL写法,参考官网:Database URL

    用户目录,windows为:C:Users登录的用户名

    提示:

    • 使用本地格式 url (如:jdbc:h2:~/test)链接 H2 ,如果没有此数据库,则会自动创建这个数据库(远程连接情况下则默认报错)。如果要禁止默认创建不存在的数据的这种行为,可以在 URL 后添加 ;IFEXISTS=TRUE 即可,如 jdbc:h2:/data/sample;IFEXISTS=TRUE

    3. 以Server模式启动H2数据库

    双击h2.bat启动数据库,会自动用默认浏览器打开数据库管理页面。如果没自动打开,也可以手动在浏览器输入URL:http://localhost:8082进入数据库管理页面。(见上面的截图)

    设置数据库端口号等配置的配置文件在用户目录有个 .h2.server.properties 文件,如:C:Userszhangsan.h2.server.properties

    使用这种方式启动 h2 后,右下角会有个黄色的小的数据库图标可以用来创建数据库/或者打开数据库控制台页面等(如下图)。

    右击数据库图标:

    • H2 Console - 点击打开浏览器 Console
    • Create a new Database... - 点击弹出窗口来创建数据库
    • Status - 显示浏览器链接数据库链接
    • Exit

    使用h2.bat打开的黑窗口不要关,要想不要黑色窗口可以双击h2w.bat启动。
    h2数据库还有其他方式启动,这里不做详细介绍了,有兴趣的可以看官方文档。

    4. 在项目中使用 H2 数据库

    你可以直接把上面下载的H2数据库的jar包复制到项目的lib中,或者使用Maven来管理。

    Maven依赖

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

    数据库配置:

    //数据库连接URL
    private static final String JDBC_URL = "jdbc:h2:~/test";
    //用户名
    private static final String USER = "sa";
    //密码
    private static final String PASSWORD = "";
    //数据库驱动
    private static final String DRIVER_CLASS="org.h2.Driver";
    

    使用JDBC操作H2数据库

    public class H2ConnTest1 {
        //数据库连接URL
        private static final String JDBC_URL = "jdbc:h2:~/test";
        //用户名
        private static final String USER = "sa";
        //密码
        private static final String PASSWORD = "";
        //数据库驱动
        private static final String DRIVER_CLASS="org.h2.Driver";
        
        public static void main(String[] args) throws Exception {
            // 加载H2数据库驱动
            Class.forName(DRIVER_CLASS);
            // 根据连接URL,用户名,密码获取数据库连接
            Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
            Statement stmt = conn.createStatement();
            //如果存在USER_INFO表就先删除USER_INFO表
            stmt.execute("DROP TABLE IF EXISTS PERSON");
            //创建USER_INFO表
            stmt.execute("CREATE TABLE PERSON(id VARCHAR(36) PRIMARY KEY,name VARCHAR(100),sex VARCHAR(4))");
            //新增
            stmt.executeUpdate("INSERT INTO PERSON VALUES('" + UUID.randomUUID()+ "','张三','男')");
            
            //删除
            stmt.executeUpdate("DELETE FROM USER_INFO WHERE name='张三'");
            //修改
            stmt.executeUpdate("UPDATE USER_INFO SET name='张三' WHERE name='王二麻子'");
            //查询
            ResultSet rs = stmt.executeQuery("SELECT * FROM USER_INFO");
            //遍历结果集
            while (rs.next()) {
                System.out.println(rs.getString("id") + "," + rs.getString("name")+ "," + rs.getString("sex"));
            }
            //释放资源
            stmt.close();
            //关闭连接
            conn.close();
        }
    }
    

    当程序运行起来的时候,会自动启动 H2 数据库,如果url格式是本地格式,会自动创建数据库。其他操作和常规MySQL、Postgresql数据库相似。
    要注意的是如果你只在测试阶段使用 H2 数据库,而生产阶段将会替换成其他数据库的话,你要注意他们二者之间的区别。

    作者:BobC

    文章原创。如你发现错误,欢迎指正,在这里先谢过了。博主的所有的文章、笔记都会在优化并整理后发布在个人公众号上,如果我的笔记对你有一定的用处的话,欢迎关注一下,我会提供更多优质的笔记的。
  • 相关阅读:
    [转贴]分贝是个什么东西?(好东东)
    [VDSP中的Warning]function declared implicitly
    [VDSP中的Warning]explicit type is missing
    [VDSP中的Warning]integer conversion resulted in a change of sign
    Java 一键多列的map
    springboot 使用邮件服务发送验证码 以及在阿里云服务器的配置
    图像处理之入门篇
    javascript怎么可以判断单选复选按钮是否选中,且传值
    QQ,MSN,SKYPE等在线状态代码 (转)
    在Access中SQL的调试
  • 原文地址:https://www.cnblogs.com/Eastry/p/13795926.html
Copyright © 2011-2022 走看看