H2 数据库的使用

最近项目用到 H2 Database 数据库,搞来搞去还不是太熟,也踩了一些坑,写小博客记录下。

如果纰漏或错误,还望评论指正,谢谢。

一、内嵌模式使用

这种模式官方里说的还是比较简单:Embedding H2 in an Application

  • Add the h2*.jar to the classpath (H2 does not have any dependencies)
  • Use the JDBC driver class: org.h2.Driver
  • The database URL jdbc:h2:~/test opens the database test in your user home directory
  • A new database is automatically created

翻译下就是:

  • h2*.jar 添加到项目目录下(H2 没有其他任何依赖)
  • JDBC 驱动类使用:org.h2.Driver
  • 数据库 URL 使用 jdbc:h2:~/test,这样会打开用户目录下的 test 数据库
  • 这个新的数据库文件会自动创建,指以上的 test

说明:

用户目录是指当前系登录用户的用户目录,Linux 下就是命令 cd ~ 进去的目录;Windows下一般就是 C:\Users\xxxxx

二、Server 模式使用

除了 内嵌模式 使用,还可以 Server 模式

不管是 Windows 还是 Linux,都建议去 官网下载 Platform-Independent Zip 这个平台独立的压缩包,解压就可以了。

解压后的目录,详见官网说明:Directory Structure

2.1 使用 Server 模式

2.1.1 Windows 下启动

双击 h2/bin/h2.bat 脚本文件就可以启动了,启动后浏览器会自动打开 http://localhost:8082,这是因为它启动了一个 The H2 Console Application 程序,使得我可以通过浏览器来访问数据库。

2.1.2 Linux 下启动
# cd h2/bin
# nohup java -cp h2*.jar org.h2.tools.Server &

说明:先进入到 H2 的 bin 目录下,然后 Server 启动模式。官网文档里 Using the Server 用的命令是 java -cp h2*.jar org.h2.tools.Server 前后的 nohup & 是我自己加的,为的是进程不占用我们的 SHH 出入,而且进程不会印因为 SHH 连接断开而退出。

启动时还可以指定参数:

# java -cp h2*.jar org.h2.tools.Server -?

比如允许远程 Web 访问和远程 TCP 访问(出于安全原因,默认只允许本机访问):

# java -cp h2-1.4.194.jar org.h2.tools.Server -webAllowOthers -tcpAllowOthers

其他参数还有 -tcpPort -webPort 等等,不细说。

2.1.3 启动 Server 模式都干了啥?

如果我们 Linux 下运行启动 Server 模式的命令

# java -cp h2*.jar org.h2.tools.Server

会发现程序会输出以下内容:

TCP server running at tcp://10.27.174.227:9092 (only local connections)
PG server running at pg://10.27.174.227:5435 (only local connections)
Web Console server running at http://10.27.174.227:8082 (others can connect)

H2 启动了三个 Server:

  • 一个 TCP Server,用于 client/server connections 连接。端口9092
  • 一个 PG server,用于 PostgreSQL clients 客户端程序。端口5435
  • 一个 Web Server,用于 H2 Console 程序。端口8082

上面的 IP 地址是本期局域网IP,每台机器的都不同。咦?默认是允许远程 Web 访问??

2.1.4 启动 Server 模式是否打开了数据库

答案是否定的:

The servers can be started in different ways, one is using the Server tool.
Starting the server doesn't open a database - databases are opened as soon as a client connects.

使用 Server tool 启动并没有打开数据库,数据库在客户端连接之后才立即打开

2.1.5 夸进程关闭 TCP Server

官网文档 Stopping a TCP Server from Another Process 有说到:

运行命令关闭:

# java org.h2.tools.Server -tcpShutdown tcp://localhost:9092

应用程序里写代码关闭:

org.h2.tools.Server.shutdownTcpServer("tcp://localhost:9094");

以上方法 仅关闭 TCP Server。还有一段注意事项:

If other server were started in the same process, they will continue to run. 
To avoid recovery when the databases are opened the next time, all connections to the databases should be closed before calling this method.

关闭远程 Server:To stop a remote server, remote connections must be enabled on the server,关闭远程 Server 需要远程 Server 启用了该支持才行。

对关闭 TCP Server 进行保护:Shutting down a TCP server can be protected using the option -tcpPassword (the same password must be used to start and stop the TCP server).,启动时指定了 -tcpPassword 那么关闭 TCP Server 时也要同样的密码才能关闭。

三、应用连接至 H2 Database

H2 数据库可以内嵌仅 Java 应用程序,也可以以 Server 模式运行。取决于 H2 数据库的运行方式,需要使用不同的数据库连接地址(JDBC connection URL)来访问

内嵌模式(Embedded into your application)

jdbc:h2:~/test

数据将被保存到 test 文件,该文件在你的用户目录下。

Server模式(Client-Server mode)

jdbc:h2:tcp://localhost/~/test

同上:数据将被保存到 test 文件,该文件在你的用户目录下。

内存模式(In-Memory database)

jdbc:h2:mem:test

另外,H2 还可以配置成运行在内存中,意味着数据不会保存到磁盘,应用程序结束,内存中的数据的丢失。

以上那么多篇幅都在说一些“运维”的事情,现在说说我们的应用怎么连接并使用 H2 数据库,这里已 Spring Boot 项目为例。

Maven pom.xml 添加 H2 依赖:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

内嵌模式 Spring Boot 的 application.properties 文件:

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:~/test
spring.datasource.username=sa

Server模式 Spring Boot 的 application.properties 文件:

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa

四、其他想说的

4.1 数据库文件

数据库文件都是保存到用户目录下的。不管是内嵌模式还是Server模式,只要 JDBC connection URL 上写的数据库名字是一样的,那么都是使用同一个数据库文件。

4.2 内嵌模式的 H2 Web Server 进程

内嵌模式的 h2 与应用程序是运行在同一个进程中,比如 Spring Boot 默认使用8080端口,那么访问 H2 Web Server 也是8080端口,因为 Spring Boot 自动配置,为 H2 Web Server 配置了一个 Handler,所以访问地址变成了:

http://localhost:8080/h2-console

相比之下,Server 模式默认的 Web Server 端口是8082,则 H2 Web Server 访问地址是:

http://localhost:8082/

五、附录

提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
### 如何配置 Navicat 连接 H2 数据库 要通过 Navicat 成功连接到 H2 数据库,需完成以下几个方面的设置: #### 1. 下载并安装 JDBC 驱动程序 H2 数据库依赖于 Java 的 JDBC 驱动来实现外部工具的连接。因此,在使用 Navicat 前,需要下载适合版本的 H2 JDBC 驱动文件 `h2*.jar` 并将其路径保存下来以便后续导入[^1]。 #### 2. 创建新的连接 在 Navicat 中创建一个新的数据库连接时,应选择 **JDBC** 类型作为目标数据库接口。以下是具体操作步骤: - 打开 Navicat 软件后点击菜单栏中的 “新建连接”。 - 在弹出窗口里找到支持自定义驱动选项的部分(通常标记为 Other 或 Custom),输入必要的参数如下表所示[^2]: | 参数名 | 描述 | |----------------|--------------------------------------------------------------------------------------| | Connection Name| 自定义名称用于识别此链接 | | Driver Type | 设置为 `org.h2.Driver`,这是官方推荐的标准类全限定名 | | URL | 形如 jdbc:h2:<path_to_db>;如果运行嵌入模式可设成类似 `jdbc:h2:~/test`;如果是服务器模式则可能是 `jdbc:h2:tcp://localhost/~/test` | 注意:URL 字符串的具体形式取决于您的 H2 实例是以何种方式部署——即本地单机版还是远程网络服务端口监听状态下的实例化过程[^3]。 #### 3. 导入 JDBC 文件至 Navicat 为了使 Navicat 可以加载来自第三方厂商开发的支持包(这里指的就是 h2*.jar),还需要手动指定其物理存储位置给应用程序读取。这一步骤一般位于高级属性或者附加组件管理界面下执行[^4]: ```bash Tools -> Options -> Drivers & Translators -> Add/Edit existing driver details. ``` 随后按照提示上传之前获取到的那个 jar 包即可生效。 #### 4. 测试连接成功与否 当以上所有前期准备工作都完成后就可以尝试发起实际握手请求验证整个流程是否通畅无误了。只需返回初始页面按下 Test Button 即能迅速得知结果反馈消息[^5]。 ```python import jaydebeapi as jd conn_str = 'jdbc:h2:/path/to/dbfile' driver_name='org.h2.Driver' username="sa" password="" jars=['path/to/h2*.jar'] try: conn = jd.connect(driver_name, conn_str , [username,password], jars ) except Exception as e: print(f'Error occurred:{e}') finally: if 'conn' in locals(): conn.close() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值