zoukankan      html  css  js  c++  java
  • 【DataBase】H2 DateBase的拓展使用

    连接模式

      支持以下连接模式:

    • 嵌入模式(使用JDBC的本地连接)
    • 服务器模式(使用JDBC或ODBC over TCP / IP进行远程连接)
    • 混合模式(同时本地和远程连接)

    嵌入模式

      在嵌入模式下,应用程序使用JDBC从同一JVM中打开数据库。这是最快速,最简单的连接模式。缺点是数据库可能只在任何时候在一个虚拟机(和类加载器)中打开。

      与所有模式一样,支持持久性和内存数据库。同时打开的数据库数量或打开的连接数量没有限制。
      

    服务器模式

      使用服务器模式(有时称为远程模式或客户端/服务器模式)时,应用程序使用JDBC或ODBC API远程打开数据库。需要在相同或另一个虚拟机或另一台计算机上启动服务器。许多应用程序可以通过连接到此服务器同时连接到同一数据库。在内部,服务器进程以嵌入模式打开数据库。

      

    混合模式

      混合模式是嵌入式和服务器模式的组合。连接到数据库的第一个应用程序在嵌入模式下执行此操作,但也启动服务器,以便其他应用程序(在不同进程或虚拟机中运行)可以同时访问相同的数据。本地连接的速度与仅在嵌入模式下使用数据库的速度一样快,而远程连接速度稍慢。

      

    数据库URL概述

    此数据库支持多种连接模式和连接设置。这是使用不同的数据库URL实现的。URL中的设置不区分大小写。

    话题URL格式和示例
    嵌入式(本地)连接 jdbc:h2:[file:][<path>]<databaseName>
    jdbc:h2:~/test
    jdbc:h2:file:/data/sample
    jdbc:h2:file:C:/data/sample (Windows only)
    内存(私有) jdbc:h2:mem:
    内存中(命名) jdbc:h2:mem:<databaseName>
    jdbc:h2:mem:test_mem

    使用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

    使用TLS的服务器模式(远程连接)
    jdbc:h2:ssl://<server>[:<port>]/[<path>]<databaseName>
    jdbc:h2:ssl://localhost:8085/~/sample;

    连接到嵌入式(本地)数据库

      用于连接到本地数据库的数据库URL是jdbc:h2:[file:][<path>]<databaseName>前缀file:是可选的。如果不使用或仅使用相对路径,则将当前工作目录用作起点。路径和数据库名称的区分大小写取决于操作系统,但建议仅使用小写字母。数据库名称长度必须至少为三个字符(限制File.createTempFile)。数据库名称不得包含分号。要指向用户主目录,请使用~/,如:jdbc:h2:~/test

    内存数据库

      对于某些用例(例如:快速原型设计,测试,高性能操作,只读数据库),可能不需要保留数据或持久更改数据。此数据库支持内存模式,其中数据不会保留。

      在某些情况下,只需要一个与内存数据库的连接。这意味着要打开的数据库是私有的。在这种情况下,数据库URL是jdbc:h2:mem:在同一虚拟机中打开两个连接意味着打开两个不同的(私有)数据库。

      有时需要与同一内存数据库的多个连接。在这种情况下,数据库URL必须包含名称。示例:jdbc:h2:mem:db1使用此URL访问同一数据库仅适用于同一虚拟机和类装入器环境。

      要从另一个进程或另一台计算机访问内存数据库,您需要在创建内存数据库的同一进程中启动TCP服务器。然后,其他进程需要使用数据库URL通过TCP / IP或TLS访问数据库,例如:jdbc:h2:tcp://localhost/mem:db1

      默认情况下,关闭与数据库的最后一个连接会关闭数据库。对于内存数据库,这意味着内容丢失。要使数据库保持打开状态,请添加;DB_CLOSE_DELAY=-1到数据库URL。要在虚拟机处于活动状态时保留内存数据库的内容,请使用jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

    H2使用

      JDBC连接内存数据库

        1、编辑测试代码

     1 package com.test.h2;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.sql.Statement;
     9 
    10 /**
    11  * Hello world!
    12  *
    13  */
    14 public class TestH2Mem {
    15     public static void main(String[] args) throws SQLException, ClassNotFoundException {
    16 
    17         // 加载HSQL DB的JDBC驱动
    18         Class.forName("org.h2.Driver");
    19 
    20         // 连接内存库,自动创建内存数据库,得到连接对象 connection
    21         // DB_CLOSE_DELAY=-1:连接关闭时,保留内存数据库的内容,程序退出才清楚内存数据库内容
    22         String url = "jdbc:h2:mem:test_mem;DB_CLOSE_DELAY=-1";
    23         Connection con = DriverManager.getConnection(url, "sa", "");
    24 
    25         // 新建数据表
    26         String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )";
    27         Statement createStatement = con.createStatement();
    28         long f1 = createStatement.executeUpdate(ctreateTable);
    29         System.out.println("创建表:" + f1);
    30 
    31         // 插入数据
    32         String insertSql = "INSERT INTO test VALUES(1,'小明')";
    33         Statement insertStatement = con.createStatement();
    34         long f2 = insertStatement.executeUpdate(insertSql);
    35         System.out.println("插入数据:" + f2);
    36         
    37         // 关闭连接
    38         con.close();
    39         
    40         // 新建连接2
    41         Connection con2 = DriverManager.getConnection(url, "sa", "");
    42 
    43         // 查询数据
    44         String selectSql = "select id,name from test";
    45         PreparedStatement prepareStatement = con2.prepareStatement(selectSql);
    46         // 发送SQL 返回一个ResultSet
    47         ResultSet rs = prepareStatement.executeQuery();
    48 
    49         // 编历结果集
    50         while (rs.next())// 从数据库的取一行数据,是否还有下一行
    51         {
    52             int id = rs.getInt(1); // 从1开始
    53             String name = rs.getString(2);
    54             System.out.println("id:" + id + "	名称:" + name);
    55         }
    56 
    57         // 关闭连接
    58         con2.close();
    59 
    60     }
    61 }

        2、运行结果:

          

      JDBC连接本地数据库

        1、编辑测试代码

     1 package com.test.h2;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.sql.Statement;
     9 
    10 /**
    11  * Hello world!
    12  *
    13  */
    14 public class TestH2Local {
    15     public static void main(String[] args) throws SQLException, ClassNotFoundException {
    16 
    17         // 加载HSQL DB的JDBC驱动
    18         Class.forName("org.h2.Driver");
    19 
    20         // 连接本地数据库,自动创建本地数据库,得到连接对象 connection
    21         String url = "jdbc:h2:file:D:/data/sample";
    22         Connection con = DriverManager.getConnection(url, "sa", "");
    23 
    24         // 新建数据表
    25         String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )";
    26         Statement createStatement = con.createStatement();
    27         long f1 = createStatement.executeUpdate(ctreateTable);
    28         System.out.println("创建表:" + f1);
    29 
    30         // 插入数据
    31         String insertSql = "INSERT INTO test VALUES(1,'小明')";
    32         Statement insertStatement = con.createStatement();
    33         long f2 = insertStatement.executeUpdate(insertSql);
    34         System.out.println("插入数据:" + f2);
    35 
    36         // 查询数据
    37         String selectSql = "select id,name from test";
    38         PreparedStatement prepareStatement = con.prepareStatement(selectSql);
    39         // 发送SQL 返回一个ResultSet
    40         ResultSet rs = prepareStatement.executeQuery();
    41 
    42         // 编历结果集
    43         while (rs.next())// 从数据库的取一行数据,是否还有下一行
    44         {
    45             int id = rs.getInt(1); // 从1开始
    46             String name = rs.getString(2);
    47             System.out.println("id:" + id + "	名称:" + name);
    48         }
    49 
    50         // 关闭连接
    51         con.close();
    52 
    53     }
    54 }

        2、运行结果,同上,同时在D盘的data目录中参数数据库文件,如下

          

        3、同时可以使用h2连接工具连接sample数据库,连接工具使用方法,参考:【DataBase】H2 DateBase的简单使用

          

      JDBC使用TCP连接远程数据库

        1、从命令行启动服务器工具,即可启动H2的tcp服务

          要Server使用默认设置从命令行启动该工具,请运行:java -cp h2*.jar org.h2.tools.Server

          

          这将使用默认选项启动该工具。要获取选项列表和默认值,请运行:java -cp h2*.jar org.h2.tools.Server -?

          配置其他值,如允许其他主机连接TCP,配置TCP端口,命令:java -cp h2-1.4.199.jar org.h2.tools.Server -tcpAllowOthers -tcpPort 9090

          

          还可以使用代码启动服务

     1 package com.test.h2;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.sql.Statement;
     9 
    10 import org.h2.tools.Server;
    11 import org.h2.util.Tool;
    12 
    13 /**
    14  * Hello world!
    15  *
    16  */
    17 public class TestH2TCPServer {
    18     
    19     public static void main(String[] args) throws SQLException, ClassNotFoundException, InterruptedException {
    20 
    21         // start the TCP Server
    22         Server server = Server.createTcpServer(new String[] { "-tcpAllowOthers", "-tcpPort", "9090" }).start();
    23         System.out.println("TCP Server 启动了......");
    24         
    25         Thread.sleep(30000);
    26         
    27         // stop the TCP Server
    28         server.stop();
    29         System.out.println("TCP Server 停止了......");
    30 
    31     }
    32 }
    View Code

        2、编辑测试代码

     1 package com.test.h2;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 import java.sql.Statement;
     9 
    10 /**
    11  * Hello world!
    12  *
    13  */
    14 public class TestH2TCP {
    15     public static void main(String[] args) throws SQLException, ClassNotFoundException {
    16 
    17         // 加载HSQL DB的JDBC驱动
    18         Class.forName("org.h2.Driver");
    19 
    20         // 使用TCP/IP的服务器,得到连接对象 connection
    21         String url = "jdbc:h2:tcp://localhost:9090/D:/data/sample";
    22         Connection con = DriverManager.getConnection(url, "sa", "");
    23 
    24         // 新建数据表
    25         String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )";
    26         Statement createStatement = con.createStatement();
    27         long f1 = createStatement.executeUpdate(ctreateTable);
    28         System.out.println("创建表:" + f1);
    29 
    30         // 插入数据
    31         String insertSql = "INSERT INTO test VALUES(1,'小明')";
    32         Statement insertStatement = con.createStatement();
    33         long f2 = insertStatement.executeUpdate(insertSql);
    34         System.out.println("插入数据:" + f2);
    35 
    36         // 查询数据
    37         String selectSql = "select id,name from test";
    38         PreparedStatement prepareStatement = con.prepareStatement(selectSql);
    39         // 发送SQL 返回一个ResultSet
    40         ResultSet rs = prepareStatement.executeQuery();
    41 
    42         // 编历结果集
    43         while (rs.next())// 从数据库的取一行数据,是否还有下一行
    44         {
    45             int id = rs.getInt(1); // 从1开始
    46             String name = rs.getString(2);
    47             System.out.println("id:" + id + "	名称:" + name);
    48         }
    49 
    50         // 关闭连接
    51         con.close();
    52 
    53     }
    54 }
    View Code

        3、运行结果,同上

  • 相关阅读:
    android部分控件应用解析
    CodeForces Round #179 (295A)
    面试题27:连续子数组的最大和
    java写文件时,输出不完整的原因以及解决方法
    序列化和反序列化--转
    Java多线程编程那些事:volatile解惑--转
    转变--一个平凡人的2017年总结及2018年展望
    系列文章--批处理学习
    set命令
    bat计算两个时间差
  • 原文地址:https://www.cnblogs.com/h--d/p/10937719.html
Copyright © 2011-2022 走看看