SpringBoot集成H2-Database

本文详细介绍了H2Database,一个轻量级的Java嵌入式数据库,包括其特点、下载安装步骤。通过一个SpringBoot项目实战,展示了如何配置、使用H2Database,包括引入依赖、配置数据源、创建实体类、定义JPA接口及进行单元测试。文章还探讨了H2的运行模式,包括内嵌式和服务式。H2Database对于开发人员来说,是一个方便快捷的数据库解决方案,尤其适用于测试和小型项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是H2Database

H2是一个开源的嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容。

二、H2Database有什么特点

1、H2是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。
2、可以同应用程序打包在一起发布
3、它的另一个用途是用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态
4、提供JDBC访问接口,提供基于浏览器的控制台,可以执行sql
5、免费,开源,够快
6、安装0配置,下载好就可以用

三、下载与安装

h2database 官网地址:http://www.h2database.com/html/main.html

下载解压后进入H2 的 bin 目录,如果在 Window 环境下使用,可以运行 h2.bat 或 h2w.bat。区别只是前者是黑框框运行,关闭黑框框就是关闭服务,后者是后台静默运行。

运行了 h2.bat,系统会进入:

或者自己打开浏览器,输入地址:http://localhost:8082 访问 H2 数据库的 Web Console。

可能看到现在还是没明白这是个啥,不要慌,看下面demo!

四、springboot使用Database

这里我用的是datajpa来作为持久层框架,原因就是他可以省去创建表,可以快速体验数据库。

1、导入依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

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

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>

2、添加springboot配置

spring:
   datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:file:D:/h2Data/test;AUTO_SERVER=TRUE
    username: sa
    password:
   jpa:
    show-sql: true
    hibernate:
      # 每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
      ddl-auto: update

这个连接输的和配置文件一样的,我是将它持久化到d盘了,可以自行更改。

3、添加实体类

@Entity
@Data
public class User {
	
	@Id //主键
	private Integer id;
	private Integer age;
	private String name;
	private String address;
	private String city;
}

4、添加jpa接口

@Repository
public interface UserRepository extends JpaRepository<User, Integer>{
}

5、测试接口

直接用单元测接口即可。

@RunWith(SpringRunner.class)
@SpringBootTest
class SpringBootH2ApplicationTests {
	
	@Autowired
	private UserRepository userRepository;

	@Test
	public void addUser() {
		User user = new User();
		user.setId(1);
	    user.setName("李四");
	    user.setAddress("北京");
	    user.setAge(19);
	    user.setCity("北京");
	    userRepository.save(user);
	}
}

查看数据库。

这里可以看到刚刚输入持久化地址,已经存在了db文件。
当我关闭服务器在启动,刚刚添加的数据仍然是存在的。这就是持久化。

五、用后感受

在做完demo瞬时间应该就明白了。说白了就是个数据库。

这个H2-Database总的来说跟mysql,oracle有点区别的,从连接上就可以看出来, 平时我们用mysql都是创建库,然后就有个固定的库连接,而Database他相当于我们可以指定连接,指定完就能使用,并且会根据连接的地址,将数据会持久化到指定位置。
至于sql层面的差距这个有待使用,毕竟很少公司在用,大部分都是oracle、mysql,但是总的来说Database来作为我们平时做小demo什么的还是挺方便的。

六、Database运行方式

所谓的运行方式,也是相当于在配置数据库连接。持久不持久化也是通过连接配置。

1、内嵌式

内嵌式主要有两种,一种是内存模式,这种模式不会落地持久化,所以比较适合测试,关闭连接后数据库就清空,只需要添加

url: jdbc:h2:mem:DBName;DB_CLOSE_DELAY=-1

另外一种是持久化模式,这种模式会将数据落地持久化到指定的目录,生成与数据库同名的.mv.db文件

url: jdbc:h2:./test

这个就是上面配置的持久化模式。
AUTO_SERVER=TRUE:启动自动混合模式,允许开启多个连接,该参数不支持在内存中运行模式

url: jdbc:h2:file:D:/h2Data/test;AUTO_SERVER=TRUE

2、服务式

服务式就是指定一个tcp的远程目录

URL = jdbc:h2:tcp://localhost/~/test
<think>我们面对的问题是:在MaxScale配置中,即使设置了`auto_failover=false`和`auto_rejoin=true`,仍然出现只读异常(即`--read-only`报错)。这通常意味着有写请求被错误地路由到了只读节点(即从节点或处于只读状态的主节点)。根据引用内容以及MaxScale的工作原理,我们可以从以下几个方面进行排查和解决:###1.**检查后端数据库节点的`read_only`状态**确保主节点的`read_only`设置为`OFF`,从节点的`read_only`设置为`ON`。可以通过以下命令检查:```sqlSHOWVARIABLESLIKE'read_only';```如果发现主节点被设置为`read_only=ON`,则需要手动修改:```sqlSETGLOBALread_only=OFF;```###2.**监控模块的配置与状态**引用[4]提到MaxScale使用监控模块(如`mariadbmon`)来检测后端节点的状态。即使`auto_failover=false`,监控模块仍然需要正确识别节点的角色(主/从)和状态(可写/只读)。检查监控模块配置:```ini[MySQL-Monitor]type=monitormodule=mariadbmonservers=server1,server2,server3user=myuserpassword=mypasswordauto_failover=false#确保自动故障转移关闭auto_rejoin=true#允许节点恢复后自动重新加入```如果监控模块未能正确检测到主节点(例如,由于网络问题或权限问题),则可能导致路由错误。查看监控日志以确认节点状态:```bashtail-f/var/log/maxscale/maxscale.log|grep-i'monitor'```###3.**读写分离路由配置**引用[1]中提到,在ProxySQL中,如果从库不可用,可以通过在`hostgroup`中配置主库并设置较低权重来让读请求回退到主库。在MaxScale中,类似的功能由`readwritesplit`路由模块的`master_accept_reads`参数控制。检查`readwritesplit`配置:```ini[ReadWrite-Service]type=servicerouter=readwritesplitmaster_accept_reads=true#允许读请求发送到主节点strict_mode=false#非严格模式,允许在从节点不可用时将读请求发送到主节点```如果`master_accept_reads=false`且所有从节点都不可用,则读请求将失败。因此,建议设置为`true`。###4.**故障转移与重加入的机制**虽然`auto_failover=false`,但节点状态的变化(如从节点故障恢复)可能触发重加入(`auto_rejoin=true`)。然而,如果重加入后节点的状态(如复制状态)不符合要求,监控模块可能不会将其标记为可用。确保从节点复制状态正常:```sqlSHOWSLAVESTATUS\G```关键字段:-`Slave_IO_Running`:Yes-`Slave_SQL_Running`:Yes-`Seconds_Behind_Master`:0或较小值###5.**MaxScale的用户权限**引用[3]中提到,MaxScale需要特殊的数据库用户来获取后端节点的状态。确保该用户(如`maxscale_route`)有足够的权限:```sqlGRANTSELECTONmysql.*TO'maxscale_route'@'%';GRANTSHOWDATABASESON*.*TO'maxscale_route'@'%';GRANTREPLICATIONCLIENTON*.*TO'maxscale_route'@'%';#监控模块需要此权限```###6.**检查是否有其他因素导致节点被设置为只读**-**Galera集群**:如果使用Galera,节点可能由于集群状态而进入只读模式(如`wsrep_desync`或`wsrep_reject_queries`)。检查Galera状态:```sqlSHOWSTATUSLIKE'wsrep%';```-**手动设置**:是否有其他管理工具或脚本将节点设置为只读?-**磁盘空间**:磁盘满可能导致数据库进入只读模式。###解决方案步骤1.**验证后端节点状态**:-登录每个数据库节点,检查`read_only`变量和复制状态。-修复任何异常状态(如将主节点设为可写,修复从节点复制)。2.**检查MaxScale监控日志**:-确认监控模块是否正确识别了节点状态(主节点为Master,从节点为Slave且运行正常)。3.**调整读写分离配置**:-确保`master_accept_reads=true`,这样当从节点不可用时,读请求可以发送到主节点。4.**验证MaxScale用户权限**:-确保监控用户(在`[MySQL-Monitor]`中配置)拥有`REPLICATIONCLIENT`权限。5.**重启MaxScale服务**(可选):```bashsystemctlrestartmaxscale```6.**测试读写操作**:-通过MaxScale的写端口执行写操作:```bashmysql-hmaxscale_ip-Pwrite_port-uuser-p-e"INSERTINTOtest.tVALUES(1);"```-如果仍然报只读错误,检查MaxScale的路由日志:```bash#在MaxScale配置中启用调试日志[maxscale]log_debug=1```然后查看日志:```bashtail-f/var/log/maxscale/maxscale.log```###总结即使设置了`auto_failover=false`和`auto_rejoin=true`,只读异常通常是由于后端节点的实际状态与MaxScale的认知不一致,或者路由配置不允许将请求发送到主节点。通过检查节点状态、监控模块配置和日志,以及调整路由参数,可以解决此问题。---###§§相关问题§§1.如何诊断MaxScale监控模块与后端数据库的连接问题?[^3]2.在MaxScale中,`strict_mode`参数如何影响读写分离的行为?[^1]3.如何配置MaxScale以实现手动故障转移?[^4]</think>### MaxScale 配置 `auto_failover=false` 和 `auto_rejoin=true` 仍报只读异常的解决方案 #### 问题核心原因分析 当 `auto_failover=false` 时,MaxScale **不会自动提升新主节点**(即使主节点故障)。若原主节点意外进入只读状态(如人为误操作、磁盘满、复制中断等),而 `auto_rejoin=true` 仅允许节点重新加入集群但不修复状态,会导致写请求持续路由到只读节点[^1][^4]。 #### 解决步骤及配置优化 ##### 1. **验证后端节点状态** ```sql -- 在主节点执行(预期应为 OFF) SHOW GLOBAL VARIABLES LIKE 'read_only'; -- 在从节点执行(预期应为 ON) SHOW GLOBAL VARIABLES LIKE 'read_only'; ``` 若主节点显示 `read_only=ON`,**强制解除只读**: ```sql SET GLOBAL read_only = OFF; ``` ##### 2. **配置监控模块主动检测只读状态** 在 `mariadbmon` 监控模块中添加状态检查脚本: ```ini [MySQL-Monitor] type=monitor module=mariadbmon servers=master,slave1,slave2 auto_failover=false # 保持手动故障转移 auto_rejoin=true # 允许节点自动重加入 monitor_interval=2000ms script=/path/to/check_read_only.sh # 关键:添加状态检查脚本 ``` 创建状态检查脚本 `check_read_only.sh`: ```bash #!/bin/bash # 检查主节点是否意外进入只读模式 READ_ONLY=$(mysql -h $1 -Nse "SELECT @@read_only") if [ "$READ_ONLY" -eq 1 ]; then mysql -h $1 -e "SET GLOBAL read_only=0;" # 强制解除只读 echo "$(date) - Fixed read-only on $1" >> /var/log/maxscale/fix.log fi ``` ##### 3. **读写分离模块容错配置** 在 `readwritesplit` 服务中启用降级机制: ```ini [ReadWrite-Service] type=service router=readwritesplit master_accept_reads=true strict_mode=false # 允许写请求降级到从节点(当主不可用时) master_failure_mode=error_on_write # 主故障时返回错误而非阻塞[^1] ``` ##### 4. **手动故障转移流程** 当主节点异常时,**手动执行切换**: ```bash # 1. 将原主节点标记为维护模式 maxctrl alter server master maintenance # 2. 提升新主节点(如slave1) maxctrl alter server slave1 master mysql -h slave1 -e "SET GLOBAL read_only=0;" # 3. 更新MaxScale路由 maxctrl call command mariadbmon reset-replication MySQL-Monitor ``` ##### 5. **关键日志诊断** 通过日志定位异常源头: ```bash # 查看MaxScale错误日志 grep "read-only" /var/log/maxscale/maxscale.log # 检查监控模块动作记录 grep "monitor" /var/log/maxscale/maxscale.log | grep "read_only" ``` #### 预防性建议 1. **设置磁盘空间监控** 80%磁盘使用率时自动清理日志,避免因磁盘满触发只读模式。 2. **启用复制状态检测** 在监控脚本中增加复制状态检查: ```bash SLAVE_STATUS=$(mysql -h $1 -e "SHOW SLAVE STATUS\G" | grep "Running") if [ -z "$SLAVE_STATUS" ]; then systemctl restart mariadb # 自动重启异常复制 fi ``` 3. **配置网络心跳检测** 防止脑裂导致多主写入冲突: ```ini [MySQL-Monitor] failover_timeout=10s detect_stale_master=true ``` > **关键提示**:在 `auto_failover=false` 场景下,建议部署外部管控平台(如Prometheus+Alertmanager)实时推送节点状态告警[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值