【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、编辑测试代码
package com.test.h2; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; /**
* Hello world!
*
*/
public class TestH2Mem {
public static void main(String[] args) throws SQLException, ClassNotFoundException { // 加载HSQL DB的JDBC驱动
Class.forName("org.h2.Driver"); // 连接内存库,自动创建内存数据库,得到连接对象 connection
// DB_CLOSE_DELAY=-1:连接关闭时,保留内存数据库的内容,程序退出才清楚内存数据库内容
String url = "jdbc:h2:mem:test_mem;DB_CLOSE_DELAY=-1";
Connection con = DriverManager.getConnection(url, "sa", ""); // 新建数据表
String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )";
Statement createStatement = con.createStatement();
long f1 = createStatement.executeUpdate(ctreateTable);
System.out.println("创建表:" + f1); // 插入数据
String insertSql = "INSERT INTO test VALUES(1,'小明')";
Statement insertStatement = con.createStatement();
long f2 = insertStatement.executeUpdate(insertSql);
System.out.println("插入数据:" + f2); // 关闭连接
con.close(); // 新建连接2
Connection con2 = DriverManager.getConnection(url, "sa", ""); // 查询数据
String selectSql = "select id,name from test";
PreparedStatement prepareStatement = con2.prepareStatement(selectSql);
// 发送SQL 返回一个ResultSet
ResultSet rs = prepareStatement.executeQuery(); // 编历结果集
while (rs.next())// 从数据库的取一行数据,是否还有下一行
{
int id = rs.getInt(1); // 从1开始
String name = rs.getString(2);
System.out.println("id:" + id + "\t名称:" + name);
} // 关闭连接
con2.close(); }
}
2、运行结果:

JDBC连接本地数据库
1、编辑测试代码
package com.test.h2; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; /**
* Hello world!
*
*/
public class TestH2Local {
public static void main(String[] args) throws SQLException, ClassNotFoundException { // 加载HSQL DB的JDBC驱动
Class.forName("org.h2.Driver"); // 连接本地数据库,自动创建本地数据库,得到连接对象 connection
String url = "jdbc:h2:file:D:/data/sample";
Connection con = DriverManager.getConnection(url, "sa", ""); // 新建数据表
String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )";
Statement createStatement = con.createStatement();
long f1 = createStatement.executeUpdate(ctreateTable);
System.out.println("创建表:" + f1); // 插入数据
String insertSql = "INSERT INTO test VALUES(1,'小明')";
Statement insertStatement = con.createStatement();
long f2 = insertStatement.executeUpdate(insertSql);
System.out.println("插入数据:" + f2); // 查询数据
String selectSql = "select id,name from test";
PreparedStatement prepareStatement = con.prepareStatement(selectSql);
// 发送SQL 返回一个ResultSet
ResultSet rs = prepareStatement.executeQuery(); // 编历结果集
while (rs.next())// 从数据库的取一行数据,是否还有下一行
{
int id = rs.getInt(1); // 从1开始
String name = rs.getString(2);
System.out.println("id:" + id + "\t名称:" + name);
} // 关闭连接
con.close(); }
}
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

还可以使用代码启动服务
package com.test.h2; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import org.h2.tools.Server;
import org.h2.util.Tool; /**
* Hello world!
*
*/
public class TestH2TCPServer { public static void main(String[] args) throws SQLException, ClassNotFoundException, InterruptedException { // start the TCP Server
Server server = Server.createTcpServer(new String[] { "-tcpAllowOthers", "-tcpPort", "9090" }).start();
System.out.println("TCP Server 启动了......"); Thread.sleep(30000); // stop the TCP Server
server.stop();
System.out.println("TCP Server 停止了......"); }
}
2、编辑测试代码
package com.test.h2; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; /**
* Hello world!
*
*/
public class TestH2TCP {
public static void main(String[] args) throws SQLException, ClassNotFoundException { // 加载HSQL DB的JDBC驱动
Class.forName("org.h2.Driver"); // 使用TCP/IP的服务器,得到连接对象 connection
String url = "jdbc:h2:tcp://localhost:9090/D:/data/sample";
Connection con = DriverManager.getConnection(url, "sa", ""); // 新建数据表
String ctreateTable = "DROP TABLE test IF EXISTS; create table test(id integer,name VARCHAR(22) )";
Statement createStatement = con.createStatement();
long f1 = createStatement.executeUpdate(ctreateTable);
System.out.println("创建表:" + f1); // 插入数据
String insertSql = "INSERT INTO test VALUES(1,'小明')";
Statement insertStatement = con.createStatement();
long f2 = insertStatement.executeUpdate(insertSql);
System.out.println("插入数据:" + f2); // 查询数据
String selectSql = "select id,name from test";
PreparedStatement prepareStatement = con.prepareStatement(selectSql);
// 发送SQL 返回一个ResultSet
ResultSet rs = prepareStatement.executeQuery(); // 编历结果集
while (rs.next())// 从数据库的取一行数据,是否还有下一行
{
int id = rs.getInt(1); // 从1开始
String name = rs.getString(2);
System.out.println("id:" + id + "\t名称:" + name);
} // 关闭连接
con.close(); }
}
3、运行结果,同上
【DataBase】H2 DateBase的拓展使用的更多相关文章
- If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
学习Spring Boot 过程中遇到了下列这个问题 Description: Failed to configure a DataSource: 'url' attribute is not spe ...
- Consider the following: If you want an embedded database (H2, HSQL or Der...
这个坑把java进程干掉就可以了,因为占用了 Description: Failed to configure a DataSource: 'url' attribute is not specifi ...
- embedded database (H2, HSQL or Derby), please put it on the classpath
Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded data ...
- 【DataBase】H2 DateBase与项目集成
本例介绍H2与web项目的集成 项目启动H2数据库 1.新建Maven Web项目,参考:[Maven]Eclipse 使用Maven创建Java Web项目 2.引入h2的jar包依赖 <de ...
- 【DataBase】H2 DateBase的简单使用
H2介绍 H2是一个开源的嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容. H2还提供兼容模式,可以兼容一些主流的数据库,因此 ...
- Spring boot 启动错误处理:Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular...
错误原因 在pom中引入了mybatis-spring-boot-starter ,Spring boot默认会加载org.springframework.boot.autoconfigure.jdb ...
- Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular profile you may ne
更多精彩关注微信公众号 错误原因 在pom中引入了mybatis-spring-boot-starter ,Spring boot默认会加载org.springframework.boot.autoc ...
- H2 Database入门
H2 Database做为轻量级的内嵌数据库,功能十分强大,而且运行时只需要一个jar包即可,下表是官网的描述: 更详细的对比见官网页面: http://www.h2database.com/html ...
- Spring Boot + Mybatis + H2 database数据库
H2 Database H2 由纯 Java 编写的开源关系数据库,可以直接嵌入到应用程序中,不受平台约束,便于测试. h2数据库特点 (1)性能.小巧 (2)同时支持网络版和嵌入式版本,另外还提供了 ...
随机推荐
- 《逆袭团队》第七次作业:团队项目设计完善&编码
实验十一 团队作业7:团队项目设计完善&编码 内容 项目 软件工程 任课教师博客主页链接 作业链接地址 团队作业7:团队项目设计完善&编码 团队名称 逆袭团队 具体目标 (1)完善团队 ...
- Intellij IDEA – How to build project automatically
By default, Intellij IDEA doesn’t compile classes automatically. But, you can enable the auto compil ...
- c语言中,如果将无符号数转换为有符号数
在使用ti的adc芯片ads1259时,芯片是24为数据格式保存的,其中最高位是符号位,因此可以理解为是有符号数据,但是在嵌入式系统中,没有直接24位的变量,因此使用32的无符号先保存24位的数据. ...
- ES中的分析和分析器
在ES存储的文档,进行存储时,会对文档的内容进行分析和分词 分析的过程: 首先,将一块文本分成适合于倒排索引的独立的 词条 , 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 reca ...
- javascript单一复制粘贴
<div id="copy-txt">内容内容</div> <button type="submit" onclick=" ...
- php自定义函数之静态变量
如果我想知道函数被调用了多少次怎么办?在没有学习静态变量的时候,我们没有好的办法来解决. 静态变量的特点是:声明一个静态变量,第二次调用函数的时候,静态变量不会再初始化变量,会在原值的基础上读取执行. ...
- OSS使用
https://www.cnblogs.com/wumian1360/p/8486726.html https://help.aliyun.com/document_detail/52204.html ...
- 洛谷 P2251 质量检测 题解
P2251 质量检测 题目背景 无 题目描述 为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后统计前M件产品中质量最差的产品的分值Q[m] = min{A1, ...
- P4555 【[国家集训队]最长双回文串】
不知道有没有人跟我一样数据结构学傻了 首先这道题是要求回文串,那么我们可以想到manacher算法 但由于\(manacher\)不能求出双回文子串,我们要考虑一些性质 首先对于一个回文串,删掉两边的 ...
- (2)Go基本数据类型
Go语言的基本类型有: bool string int.int8.int16.int32.int64 uint.uint8.uint16.uint32.uint64.uintptr byte // u ...