SpringBoot不依赖(禁用)Gemfire数据库启动的方法

2023-11-09

     默认情况下SpringBoot的启动是要依赖GemFire做为缓存数据库的,如果做一个小的项目,不需要缓存数据库,这将是一个不容易摘除的工作。

     通过对其官网技术资料的分析,这个也很容易做到,说一下我的技术环境:
     Spring boot版本:2.1.7.RELEASE
     说一下我的业务环境,原来有一个项目使用GemFire做集群,主要的功能是缓存用户信息、用户Token和与底层单片机打交道的程序模块。

      如下是我的改造方法:

      一、删除所有@Region为实体的对象,然后删除对应的dao,service和controller,这是根治不使用Gemfire数据库的重要操作。

      举例说明:

      实体:BusAlarmInfo.java

@Setter
@Getter
@Region("bus_alarm_info")
public class BusAlarmInfo{

    @Id
    private BusDateKey key;

    private Set<AlarmInfoItem> alarms;

    public BusAlarmInfo() {
    }
}

     DAO:BusAlarmInfoRepository.java

public interface BusAlarmInfoRepository extends GemfireRepository<BusAlarmInfo, BusDateKey> {
}

   一个工作原则,所有涉及到这些类的相关程序都要删除,或者注解掉,保证程序能够正常编译就行。

   二、从依赖中完全排除gemfire和spring-data-gemfire。在pom.xml中移除这些依赖:

<dependency>
    <groupId>io.pivotal.gemfire</groupId>
    <artifactId>gemfire</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.geode</groupId>
    <artifactId>spring-data-geode</artifactId> 
</dependency>
三.(可选)在application.yaml配置文件当中声明使用本地私有数据缓冲。配置如下:
Spring
  cache:
    type: simple
  data:
    gemfire:
      cache:
        location: ON
经过本人测试,这一步设置了在启动时不会报错,也不会有警告信息。如果没有这一步只有一些警告信息,并不影响程序正常启动。

四、如果应用有一个自定义的启动引导类(extends SpringBootServletInitializer),进行如下修改,
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.gemfire.config.annotation.ClientCacheApplication;
import org.springframework.data.gemfire.config.annotation.EnablePdx;

import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * .
 *
 * <p>
 *
 * weiya He
 * @since 1.3.0
 *
 * <p><b>Note:</b>
 * <p>2020/8/24 13:48: created.<br>
 */
@SpringBootApplication
@EnableScheduling
@ClientCacheApplication(name = "aiBoxGM", locators = @ClientCacheApplication.Locator, subscriptionEnabled = false)
@EnablePdx
public class Application  {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
重要的注入声明:
1. @ClientCacheApplication注解的locators属性必须指定Gemfire服务器的主机和端口,但你只有@ClientCacheApplication.Locator,这是错误的。它应该类似于:
locators = {"localhost:40404"} 
2. @EnablePdx注解启用了Gemfire的Pdx序列化,但你的客户端无法连接到服务器,所以Pdx目前无法使用。这可能会导致其他错误。
3. 你应该在application.properties中指定
spring.data.gemfire.pool.subscriptionEnabled=false
或者使用我上面的第三步的方法,都可以。
4. 可以捕获ConnectionRefusedException,并在日志中打印更详细的上下文以帮助找出问题。修复后的代码如下:
@SpringBootApplication
@EnableScheduling  
@ClientCacheApplication(name = "aiBoxGM", locators = {"localhost:40404"})  
public class Application  {

    @Bean
    public CacheListener cacheListener() {
        return new CacheListenerAdapter() {
            @Override
            public void afterCreate(EntryEvent event) {
                // Ignore PdxInstance for now until server is available
            }
        };
    }
    
    public static void main(String[] args) {
        try {
            SpringApplication.run(Application.class, args);    
        } catch (ConnectionRefusedException e) {
            System.err.println("Unable to connect to Gemfire server!");
            e.printStackTrace();
        }
    }

}

注意,这时要把pom.xml当中加入:
 

<dependency>
            <groupId>org.springframework.geode</groupId>
            <artifactId>spring-geode-starter</artifactId>
            <version>1.1.0.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

如果问题仍未解决,请提供你完整的 Spring Boot配置、代码和日志,我很乐意帮助进一步诊断和修复。

总结一下:
1. 删除所有与Gemfire集成相关的代码,包括@Region实体、DAO和服务等等。这是最根本的一步。
2. 从依赖中完全排除gemfire和spring-data-gemfire。这可以防止Gemfire与Spring Boot的自动集成。
3. 在application.properties中配置spring.data.gemfire.cache.location=OFF可以避免启动时与Gemfire相关的警告,这一步可选但推荐。
4. 确保启动引导类中没有初始化GemfireCache。需要删除@ClientCacheApplication和locators属性。
5. @EnablePdx注解,因为Pdx需要连接到Gemfire服务器才能使用。
6. 捕获ConnectionRefusedException并打印详细日志以帮助排查问题。
7. 如果有自定义的CacheListener,需要添加判断以免错误地调用Pdx相关方法。
 

另外,如果要排除一些类使用gemfire的话,可以使用:
 

@EnableGemfireRepositories(basePackageClasses= {你的包+类名.class})
public class Application  {
}

启动后的日志将是这样的:

Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@170cbd63]
2023-06-06 09:19:43.175  INFO --- [Timer-DEFAULT-3] AutoConnectionSourceImpl : updateLocatorInLocatorList changing locator list: loc form: LocatorAddress [socketInetAddress=localhost/127.0.0.1:10334, hostname=localhost, isIpString=false] ,loc to: localhost/127.0.0.1:10334
2023-06-06 09:19:43.176  INFO --- [Timer-DEFAULT-3] AutoConnectionSourceImpl : updateLocatorInLocatorList locator list from:[localhost/127.0.0.1:10334] to: [LocatorAddress [socketInetAddress=localhost/127.0.0.1:10334, hostname=localhost, isIpString=false]]
2023-06-06 09:19:43.182  INFO --- [Timer-DEFAULT-3] AutoConnectionSourceImpl : updateLocatorInLocatorList changing locator list: loc form: LocatorAddress [socketInetAddress=localhost/127.0.0.1:10334, hostname=localhost, isIpString=false] ,loc to: localhost/127.0.0.1:10334
2023-06-06 09:19:43.182  INFO --- [Timer-DEFAULT-3] AutoConnectionSourceImpl : updateLocatorInLocatorList locator list from:[localhost/127.0.0.1:10334] to: [LocatorAddress [socketInetAddress=localhost/127.0.0.1:10334, hostname=localhost, isIpString=false]]
2023-06-06 09:19:43.182  INFO --- [Timer-DEFAULT-3] ConnectionManagerImpl : Unable to prefill pool to minimum because: Unable to connect to any locators in the list [LocatorAddress [socketInetAddress=localhost/127.0.0.1:10334, hostname=localhost, isIpString=false]]
2023-06-06 09:19:43.191  INFO --- [ueTimer-DEFAULT] AutoConnectionSourceImpl : updateLocatorInLocatorList changing locator list: loc form: LocatorAddress [socketInetAddress=localhost/127.0.0.1:10334, hostname=localhost, isIpString=false] ,loc to: localhost/127.0.0.1:10334
2023-06-06 09:19:43.192  INFO --- [ueTimer-DEFAULT] AutoConnectionSourceImpl : updateLocatorInLocatorList locator list from:[localhost/127.0.0.1:10334] to: [LocatorAddress [socketInetAddress=localhost/127.0.0.1:10334, hostname=localhost, isIpString=false]]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot不依赖(禁用)Gemfire数据库启动的方法 的相关文章

  • QT源码剖析-QT对象通信机制信号槽的绑定具体实现

    本文详细介绍QT核心机制之一 信号和槽 我们在此根据Qt源代码一步一步探究其信号槽的实现过程 核心知识点 模板元编程技术 Qt moc预编译机制 QObject类 目录 1 QObject类介绍 2 相关助手类介绍 2 1 类型 函数指针

随机推荐

  • pip安装出现Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory: '

    问题描述 pip安装库或者更新pip版本时出现如下问题 Could not install packages due to an EnvironmentError Errno 2 No such file or directory c us
  • LeetCode 面试题01.09 字符串轮转

    题目 字符串轮转 给定两个字符串s1和s2 请编写代码检查s2是否为s1旋转而成 比如 waterbottle 是 erbottlewat 旋转后的字符串 示例1 输入 s1 waterbottle s2 erbottlewat 输出 Tr
  • 一个独特的开源插件evil.js

    前言 最近发现一个好玩有解压的开源插件 注意 不可使用在正式项目中 这里分享下 gitee地址 evil js 此代码仅在周日的时候执行以下逻辑 声明 请勿用于任何项目 如果导致任何问题 与本人无关https gitee com haoxi
  • 矩阵LU分解

    一 矩阵LU分解定理 设A为n阶矩阵 如果A的顺序主子式Di 0 i 1 2 n 1 则A可以分解为一个单位下三角矩阵L和一个上三角矩阵U的乘积 且这种分解是唯一的 即A LU 二 矩阵LU分解Python代码 自己原创 def lu de
  • 第十二章 - 条件判断(case when 和 if)和视图

    第十二章 条件判断 case when 和 if 和视图 view if 的用法 case when 的用法 视图 view 的用法 if 的用法 通过使用if函数可以实现数据二分类或者多分类的功能 比如按年龄区分青年 中年 老年 或者按价
  • Python2_Pandas库(数据读取)

    1 数据读取 food info csv数据 import pandas food info pandas read csv food info csv read csv函数读取csv数据文件 print type food info Da
  • 汇编笔记——判断大小

    判断指令 CMP AL num 判断条件 这里的JA JB JE JMP相当于goto命令 JA L0 A gt above AL比num大 执行L0 JB L1 B gt below AL比num小 执行L1 JE L2 E gt equ
  • 树结构转List

    使用LinkedList效率更高 1 单个顶级节点 public static List
  • 网络安全(黑客技术)自学笔记

    目录 一 自学网络安全学习的误区和陷阱 二 学习网络安全的一些前期准备 三 网络安全学习路线 四 学习资料的推荐 想自学网络安全 黑客技术 首先你得了解什么是网络安全 什么是黑客 网络安全可以基于攻击和防御视角来分类 我们经常听到的 红队
  • chromium之jumplist

    chrome在win7及之后系统添加jumplist功能 jumplist即系统任务栏相关的功能 包括任务栏图标 鼠标放置后视图 进度条 右键菜单等等 路径 chromium src chrome browser win jumplist
  • 21. 合并两个有序链表

    21 合并两个有序链表 简单 将两个升序链表合并为一个新的 升序 链表并返回 新链表是通过拼接给定的两个链表的所有节点组成的 输入 l1 1 2 4 l2 1 3 4 输出 1 1 2 3 4 4 示例 2 输入 l1 l2 输出 示例 3
  • vue 阻止事件冒泡,捕获方法

    要想了解 VUE 阻止事件冒泡和捕获方法 首先要了解一下 JS 事件和 JS 阻止事件冒泡 捕获方法 1 js 事件的三阶段 捕获阶段 目标阶段 执行当前对象的事件处理程序 冒泡阶段 2 js 阻止事件冒泡 捕获 阻止事件冒泡 event
  • OceanBase 安全审计之透明加密

    承接前文 OceanBase 安全审计的 传输加密 本文主要实践数据透明加密 并验证加密是否有效 作者 张乾 外星人2号 兼任四位喵星人的铲屎官 爱可生开源社区出品 原创内容未经授权不得随意使用 转载请联系小编并注明来源 本文约 1200
  • layui导入Excel文件

    具体如下图所示 首先 导入layui第三方插件js 地址 https fly layui com extend excel 1 在页面中引入excel js文件 引入excel layui config base layui ext ext
  • NOIP 1998 普及组 复赛 幂次方

    NOIP 1998 普及组 复赛 幂次方 1208 2的幂次方表示 此文代码与本人极其相似 唯一不同就是此文代码成功了 http www cnblogs com bofengyu p 4477355 html 思路 先打印2 7 2 3 2
  • 【死磕 Java 基础】--- 我一口气自己就动手实现一个 LRU

    大家好 我是大明哥 个人网站 https www topjava cn LRU 即 Least Recently Use 直译为 最近最少使用 它是根据数据的历史访问记录来进行数据淘汰的 淘汰掉最先访问的数据 其核心思想是 如果数据最近被访
  • UE4_编辑器UMG关闭窗口不能立刻销毁UMG

    问题描述 运行UMG 使之创建显示到视口 效果如下 点击关闭按钮 再次运行该UMG 使之显示到视口 通过在c 中获取该UMG的数量 发现数量为2 不是所预计得1 导致编写得代码出现bug 修改办法 截图如下 该解决办法不是实用所有程序 因为
  • Linux IPC之内存映射mmap()

    导言 如何使用mmap 系统调用来创建内存映射 它可以用于IPC以及其他很多方面 概述 mmap 系统调用 在调用进程的虚拟地址空间中创建一个新内存映射 映射分为两种 文件映射 内存映射文件 将一个文件的一部分直接映射到调用进程的虚拟内存中
  • C# 文件操作之创建文件夹

    本文章主要是讲述C 中文件操作的基础知识 如何创建文件夹 创建文件 介绍Directory类 DirectoryInfo类和使用FolderBrowserDialog组件 文件夹对话框 文章属于基础知识 参考了书籍刘丽霞 C 范例开发大全
  • SpringBoot不依赖(禁用)Gemfire数据库启动的方法

    默认情况下SpringBoot的启动是要依赖GemFire做为缓存数据库的 如果做一个小的项目 不需要缓存数据库 这将是一个不容易摘除的工作 通过对其官网技术资料的分析 这个也很容易做到 说一下我的技术环境 Spring boot版本 2