Ignite和SpringBoot整合时出现Failed to initialize system DB connection......MULTI_THREADED问题解决

本文主要是介绍Ignite和SpringBoot整合时出现Failed to initialize system DB connection......MULTI_THREADED问题解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求

计网实验需要使用SpringBoot+Ignite+JWT完成一个登录并存储用户权限的功能。

前期准备

在github上找了一个源码仓库:Spring Boot整合JWT实现用户认证。和我的需求十分接近,遂下载下来准备在其基础上二次开发。但是其由于是两年前的仓库,一些依赖包的版本到今天已经更新了不少。于是我准备将这些依赖包都更新到新版本,同时使用gradle而非原来的maven作为构建工具。

在问题出现时,和Ignite有关的代码如下:

@Configuration
public class IgniteCfg {/*** 初始化ignite节点信息* @return Ignite*/@Beanpublic Ignite igniteInstance(){// 配置一个节点的ConfigurationIgniteConfiguration cfg = new IgniteConfiguration();// 设置该节点名称cfg.setIgniteInstanceName("springDataNode");// 启用Peer类加载器cfg.setPeerClassLoadingEnabled(true);// 创建一个Cache的配置,名称为PersonCacheCacheConfiguration ccfg = new CacheConfiguration("PersonCache");// 设置这个Cache的键值对模型ccfg.setIndexedTypes(Long.class, Person.class);// 把这个Cache放入springDataNode这个Node中cfg.setCacheConfiguration(ccfg);// Ignite persistence configuration.// 创建一个持久化存储的设置DataStorageConfiguration storageCfg = new DataStorageConfiguration();// Enabling the persistence.// 是这个设置允许持久化存储storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);// 设置持久化存储路径storageCfg.setStoragePath("/opt/storage");// Applying settings.// 把这个Configuration放到springDataNode这个Node中cfg.setDataStorageConfiguration(storageCfg);// 启动这个节点Ignite ignite = Ignition.start(cfg);// 激活集群ignite.cluster().active(true);return ignite;}.......}

问题

我修改过的build.gradle配置文件如下。

plugins {id 'org.springframework.boot' version '2.3.0.RELEASE'id 'io.spring.dependency-management' version '1.0.9.RELEASE'id 'java'
}group = 'com.fwh'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'repositories {maven { url 'https://maven.aliyun.com/repository/public/' }maven { url 'https://maven.aliyun.com/repository/spring/'}maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'compile group: 'org.apache.ignite', name: 'ignite-core', version: '2.8.1'compile group: 'org.apache.ignite', name: 'ignite-spring', version: '2.8.1'compile group: 'org.apache.ignite', name: 'ignite-spring-data_2.2', version: '2.8.1'compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'compile group: 'com.h2database', name: 'h2', testImplementation('org.springframework.boot:spring-boot-starter-test') {exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'}
}test {useJUnitPlatform()
}

按理说应该已经基本上添加了能够想到的所有依赖。但是运行项目,报错。
在这里插入图片描述
在这里插入图片描述

问题分析

首先对上面的igniteInstance编写单元测试,Ignite在不与Spring Boot产生关系的情况下能正常运行,可以说明确实是在两者配合时发生了bug.

首先就此问题询问一位已经完成的同学。
聊天记录-w40
关于h2的依赖问题,其实在网上有过广泛的讨论。在不久前的Ignite版本中,由于Ignite使用的h2依赖和Spring使用的h2依赖版本不一致,导致经常出现h2 property NESTED_JOINS doesn't exist问题。stackoverflow上的一个经典问答如下:
ignite won’t start with spring-boot 2.0.5 - h2 property NESTED_JOINS doesn’t exist

但是,这个问题我已经排查过了,在上面的build.gradle中明确声明了h2依赖。另外在找资料时我发现有人提到在最新的Ignite2.8版本中已经没有这个问题了。
在这里插入图片描述
该评论链接:ignite和springboot结合无法启动问题

这边陷入死路,在网上查找了几个小时的相关资料无果。回过头来重新审视自己的build.gradle和那位做完实验的同学的pom.xml,似乎只有一点不一样,他加入了连接MySql的依赖而我没有。于是我也尝试加入了mySql-connector-java的依赖,然后发现错误竟然奇迹般的消失了。

解决方法

在build.gradle中添加如下依赖:

compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.20'

问题反思

这个解决方法非常匪夷所思!因为我在整个代码中并没有用到MySQL。在问题出现时,我的项目中和Ignite相关的代码只有igniteInstance那几行。甚至还没有用到持久化,为什么会需要MySQL的依赖呢?

一个猜想难道是由于Ignite内置的H2数据库或者说引擎本身不提供多线程的服务,导致了Caused by : ...: : Unsupported connection setting "MULTI_THREADED"。而声明了MySQL依赖后,Ignite改用了MySQL引擎,而MySQL可以提供相关的服务?

这个问题目前就只能先这样留作疑问了,如果我之后有机会会对Ignite深入学习的话,也许我会来补充完这篇博客。

其他

在解决问题的过程中,我尝试过将h2依赖更换为其他版本。但在我的机器上,除了1.4.197之外的版本都会直接在编译时报错。只有1.4.197可以编译成功(虽然其在运行时报出了上文中提到的错误)。

一个Ignite的中文文档网站:Apache Ignite技术服务网,点击导航栏里的java就可以跳转到文档页。

使用的github的作者的另一篇博客:在Spring Boot上部署ignite数据库的小例子

这篇关于Ignite和SpringBoot整合时出现Failed to initialize system DB connection......MULTI_THREADED问题解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/219247

相关文章

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

JAVA集成本地部署的DeepSeek的图文教程

《JAVA集成本地部署的DeepSeek的图文教程》本文主要介绍了JAVA集成本地部署的DeepSeek的图文教程,包含配置环境变量及下载DeepSeek-R1模型并启动,具有一定的参考价值,感兴趣的... 目录一、下载部署DeepSeek1.下载ollama2.下载DeepSeek-R1模型并启动 二、J

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线