【MogDB】实战MogDB数据库适配Halo博客系统1.6版本(基于springframework+hibernate+HikariPool)
前言
前一篇文章说了MogDB适配Halo,【MogDB】将流行的博客系统Halo后端的数据库设置为MogDB,但是适配的是2.x版本,由于2.x版本已经引入了对postgresql的支持,而MogDB对于postgresql有很好的兼容性,因此适配起来很简单。但是由于halo2.x的版本进行了全部的重构,从1.6版本并不能无痛升到2.x版本,所以仍有很多用户在使用1.6版本。又由于Halo1.6版本并未适配postgresql,只支持H2和MYSQL两种数据库,因此不能像2.x那种适配直接改个数据库连接完事,需要对halo的源码进行一些调整,本文就记录一下MogDB适配Halo1.6的一些过程。
适配过程
先参考halo官方文档中1.6版本里使用mysql的安装方式,把数据库连接进行修改,直接启动,会报错,找不到postgresql的驱动,这是因为halo1.6的jar程序并没有打包postgresql的驱动,所以还是得下载源码来进行手动修改了
- 克隆halo1.6的代码
git clone -b release-1.6 https://gitee.com/halo-dev/halo.git
- 打开build.gradle,在dependencies里引入jdbc驱动(用runtimeOnly 和implementation应该都行)
implementation 'io.mogdb:mogdb-jdbc:5.0.0.4.pg'
然后打包程序再试…
等等,貌似没说这个程序要怎么打包,其实对于java开发人员来说这个打包很简单,我也就简单说下几个步骤,具体细节大家自己去搜吧
- 装jdk环境,记得配环境变量
- 装gradle环境,记得配环境变量
- 命令行进入项目目录,执行 gradle build
打包好了,启动程序,会发现报错
Flyway Teams Edition or PostgreSQL upgrade required: PostgreSQL 9.2 is no longer supported by Flyway Community Edition
Flyway是一个数据库对象版本管理的组件,可以用于在应用升级时,管理数据库对象的升级。这个报错信息提示,Flyway的社区版本已经不支持postgresql 9.2,建议改用更高的数据库版本或者使用Flyway Teams版本。
其实这里由于Halo1.6已经停止维护,不会再有升级,因此我们可以把相关的代码完全去掉
- 打开.\halo\src\main\java\run\halo\app\listener\StartedListener.java ,找到以下代码进行如下注释
public void onApplicationEvent(ApplicationStartedEvent event) {/* try {this.migrate();} catch (SQLException e) {log.error("Failed to migrate database!", e);} */this.initDirectory();this.initThemes();this.printStartInfo();this.configGit();}
然后打包再试,发现可以成功启动了,前台web页面也可以打开。但是在前台页面进行初始化安装时,报错了
org.springframework.orm.jpa.JpaSystemException: could not insert: [run.halo.app.model.entity.Post]; nested exception is org.hibernate.exception.GenericJDBCException: could not insert: [run.halo.app.model.entity.Post]
...
Caused by: java.sql.SQLException: Start position [1] cannot exceed overall CLOB length [0]
网上查,说这是hibernate的bug,但是我觉得不像。这个报错的原因在于,halo里对表字段的注解,有几个字段加了@Lob ,并且又声明了是string,因此会把表建成对应数据库的文本大对象类型,比如oracle中是clob。但是在postgresql中,会建成text,这个类型并不是大对象,只是长度比较长的字符串类型而已,它不需要进行对象的初始化,而框架就会认为这是大对象,要插空时应该插入空对象,插入null就报错了。
- 于是,我们把所有的@Lob全部去掉,并手动指定这些字段类型为text(如果不指定,字段类型会变成varchar(255) 长度不够),涉及到6个文件
.\halo\src\main\java\run\halo\app\model\entity\BasePost.java
.\halo\src\main\java\run\halo\app\model\entity\Content.java
.\halo\src\main\java\run\halo\app\model\entity\ContentPatchLog.java
.\src\main\java\run\halo\app\model\entity\Journal.java
.\src\main\java\run\halo\app\model\entity\Option.java
.\src\main\java\run\halo\app\model\entity\ThemeSetting.java
以下为一处修改例子
@Column(name = "original_content" ,columnDefinition = "text")//@Lobprivate String originalContent;
打包运行–正常
在web页面操作初始化–正常
新建文章,并保存发布-正常
查看文章–报错,主题文件不存在
由于源码中,默认的主题目录链接到github的另一个仓库里去了(./src/main/resources/templates/themes/anatole @ 3e7666f),git clone可能没有把相关文件下载下来,所以我们打的包里没有主题文件,需要手动复制进去,这个只要将原始环境中的templates目录覆盖过来,并在后台启用主题即可
完整方案
一、代码修改部分
- 引入jdbc驱动
- 去掉flyway的使用
- 把@Lob都去掉,手动指定text类型
二、启动配置文件部分
server:port: 8090# Response data gzip.compression:enabled: false
spring:datasource:driver-class-name: org.postgresql.Driverurl: jdbc:postgresql://127.0.0.1:26050/halo160?stringtype=unspecified&batchMode=offusername: halopassword: Halo@123jpa:database-platform: org.hibernate.dialect.PostgreSQLDialectproperties:hibernate:temp:use_jdbc_metadata_defaults: falsehalo:# Your admin client path is https://your-domain/{admin-path}admin-path: admin# memory or levelcache: memory
三、数据库部分
- 创建PG兼容性的库
create database halo160 dbcompatibility ='PG';\c halo160
- 创建连接用户
create user halo password 'Halo@123' ;
四、成品
修改后的代码已上传到我的gitee仓库,欢迎测试和学习(和本篇文章内的修改略有不同)
https://gitee.com/darkathena/halo/tree/dev-1.6-for-mogdb/
- 本文作者: DarkAthena
- 本文链接: https://www.darkathena.top/archives/mogdb-halo160
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
相关文章:
【MogDB】实战MogDB数据库适配Halo博客系统1.6版本(基于springframework+hibernate+HikariPool)
前言 前一篇文章说了MogDB适配Halo,【MogDB】将流行的博客系统Halo后端的数据库设置为MogDB,但是适配的是2.x版本,由于2.x版本已经引入了对postgresql的支持,而MogDB对于postgresql有很好的兼容性,因此适配起来很简单。但是由于halo2.x的版本…...

Python与FPGA——局部二值化
文章目录 前言一、局部二值化二、Python局部二值化三、FPGA局部二值化总结 前言 局部二值化较全局二值化难,我们将在此实现Python与FPGA的局部二值化处理。 一、局部二值化 局部二值化就是使用一个窗口,在图像上进行扫描,每扫出9个像素求平均…...

shell文本处理工具-shell三剑客1
shell脚本常用基础命令2 shell脚本常用基础命令 shell脚本常用基础命令2一、grep用法二、sed用法2.1p参数 (显示)n参数(只显示处理过的行) 文本处理三剑客:grep sed awk 一、grep用法 grep -E egrep (扩展搜索正文表…...

函数的传入参数-传参定义
基于函数的定义语法: def 函数名(传入参数)函数体return 返回值 可以有如下函数定义: def add(x,y):return xyprint(f"{x} {y}的结果是:{result}") 实现了,每次计算的是xy,而非…...

主流接口测试框架对比,究竟哪个更好用
公司计划系统的开展接口自动化测试,需要我这边调研一下主流的接口测试框架给后端测试(主要测试接口)的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求,看哪个框架更适合我们。 需求 1、接口编写…...
常用python模板
1.简单脚本模板 def main():#代码逻辑if __name__"__main__":main() 2.类定义模板 Class Myclass:def __init__(self,parameter):self.parameterparameterdef my_method(self):#方法逻辑 3.函数定义模板 def my_function(parameter):#代码逻辑return result 4.…...
53. 最大子数组和(力扣LeetCode)
文章目录 53. 最大子数组和题目描述暴力(运行超时)贪心 53. 最大子数组和 题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组…...
如何远程SSH连接在家的服务器主机
当您需要通过SSH远程连接到家里的服务器主机时,以下是更详细的实施步骤: 1. 确保服务器主机已开启SSH服务 安装SSH服务:首先,确保您的服务器主机上安装了SSH服务。根据您的操作系统,您可以使用相应的包管理器来安装。…...

【亲测有效】解决三月八号ChatGPT 发消息无响应!
背景 今天忽然发现 ChatGPT 无法发送消息,能查看历史对话,但是无法发送消息。 可能的原因 出现这个问题的各位,应该都是点击登录后顶部弹窗邀请 [加入多语言 alapha 测试] 了,并且语言选择了中文,抓包看到 ab.chatg…...

vue结合vue-electron创建应用程序
这里写自定义目录标题 安装electron第一种方式:vue init electron-vue第二种方式:vue add electron-builder 启动electron调试功能:background操作和使用1、覆盖窗口的菜单上下文、右键菜单2、监听关闭事件、阻止默认行为3、创建悬浮窗口4、窗…...

【C++】STL(二) string容器
一、string基本概念 1、本质 string是C风格的字符串,而string本质上是一个类 string和char * 区别: char * 是一个指针 string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。 2、特点 1、stri…...

PyCM:Python中的混淆矩阵库
PyCM:Python中的混淆矩阵库 在机器学习和数据科学领域,评估模型的性能是至关重要的。混淆矩阵是一种常用的评估工具,用于可视化和量化分类模型的预测结果。PyCM是一个开源的Python库,提供了丰富的功能来计算和分析混淆矩阵。本文将…...

Day22:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用
目录 开发环境 数据导入-mysql架构&库表列 数据库操作-mysqli函数&增删改查 数据接收输出-html混编&超全局变量 第三方插件引用-js传参&函数对象调用 完整源码 思维导图 PHP知识点: 功能:新闻列表,会员中心࿰…...
IOS面试题object-c 61-70
61. 阐述isKindOfClass、isMemberOfClass、selector作用分别是什么?isKindOfClass:作用是某个对象属于某个类型或者继承自某类型。 isMemberOfClass:某个对象确切属于某个类型。 selector:通过方法名,获取在内存中的函…...
Git指令reset的参数soft、mixed与hard三者之间的区别
主要内容 reset默认不写参数,与使用mixed参数含义一样 为了描述简洁,使用下图说明: #mermaid-svg-LtChquRXlEV1j6og {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LtChquRXlEV1j…...
RGMII 接口调试
目录 硬件检查 软件检查 调试步骤 硬件检查 硬件工程师检查原理图和PCB,核查RGMII线路连接是否正确,PHY的 TX连接对端 RX,PHY的RX连接对端TX,原理图上以引脚序号引脚名 引脚类型(输入还是输出)逐一核查RGMII接口各个网络&#…...

Ubuntu 24.04 抢先体验换国内源 清华源 阿里源 中科大源 163源
Update 240307:Ubuntu 24.04 LTS 进入功能冻结期 预计4月25日正式发布。 Ubuntu22.04换源 Ubuntu 24.04重要升级daily版本下载换源步骤 (阿里源)清华源中科大源网易163源 Ubuntu 24.04 LTS,代号 「Noble Numbat」,即将与我们见面! Canonica…...
软件设计模式:模板方法模式
1. 简介 模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤延迟到子类中实现。这样,可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 2. 使用条件 模板方法模式适用于以下情况: 算法…...

【算法】Hash存储——开放寻址法
模拟散列表 维护一个集合,支持如下几种操作: I x,插入一个整数 x; Q x,询问整数 x是否在集合中出现过; 现在要进行 N次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N&am…...

STM32CubeIDE基础学习-STM32CubeIDE软件程序下载方法
STM32CubeIDE基础学习-STM32CubeIDE软件代码下载方法 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件代码下载方法前言第1章 代码下载第2章 下载器固件更新总结 前言 编写完代码,一般都会选择在线下载程序的方式进行验证该程序是否正确,如果发现结果和…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...