【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章 下载器固件更新总结 前言 编写完代码,一般都会选择在线下载程序的方式进行验证该程序是否正确,如果发现结果和…...
3步搞定离线软件包管理:apt-offline让你的Linux系统摆脱网络依赖
3步搞定离线软件包管理:apt-offline让你的Linux系统摆脱网络依赖 【免费下载链接】apt-offline Offline APT Package Manager 项目地址: https://gitcode.com/gh_mirrors/ap/apt-offline 在现代Linux系统管理中,我们经常面临这样的困境࿱…...
Windows系统优化新选择:WinUtil一键式管理工具实用指南
Windows系统优化新选择:WinUtil一键式管理工具实用指南 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 你是否曾为Windows系统的繁…...
微信支付运营户 vs 基本户彻底搞懂:商家转账到零钱的资金流与账户权限实操指南
微信支付商户账户体系全解析:从资金流到权限设置的实战指南 第一次登录微信支付商户后台时,那些专业术语和复杂的资金流向是否让你感到手足无措?作为刚接手这项工作的财务或技术人员,理解运营户和基本户的区别就像学习一门新语言…...
Steam成就解锁工具:如何修复游戏bug并管理你的Steam成就
Steam成就解锁工具:如何修复游戏bug并管理你的Steam成就 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager Steam Achievement Manager࿰…...
终极SketchUp STL插件指南:3D打印爱好者的完美转换解决方案
终极SketchUp STL插件指南:3D打印爱好者的完美转换解决方案 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 你是否…...
BlenderKit实战指南:3D创作效能革命的智能资产管理系统深度解析
BlenderKit实战指南:3D创作效能革命的智能资产管理系统深度解析 【免费下载链接】BlenderKit Official BlenderKit add-on for Blender 3D. Documentation: https://github.com/BlenderKit/blenderkit/wiki 项目地址: https://gitcode.com/gh_mirrors/bl/BlenderK…...
CogVideoX-2b镜像避坑指南:解决显存溢出、黑屏等常见问题
CogVideoX-2b镜像避坑指南:解决显存溢出、黑屏等常见问题 1. 为什么你需要这份避坑指南 当你第一次尝试使用CogVideoX-2b生成视频时,可能会遇到各种意外情况:显存突然爆满、生成的视频全是黑屏、或者等待了十分钟却没有任何输出。这些问题不…...
终极Resemble.js图像分析指南:从基础API到高级功能详解
终极Resemble.js图像分析指南:从基础API到高级功能详解 【免费下载链接】Resemble.js Image analysis and comparison 项目地址: https://gitcode.com/gh_mirrors/re/Resemble.js Resemble.js是一款强大的图像分析与比较工具,能够帮助开发者轻松实…...
终极指南:解决Faiss在AIX平台的大端序兼容性问题
终极指南:解决Faiss在AIX平台的大端序兼容性问题 【免费下载链接】faiss A library for efficient similarity search and clustering of dense vectors. 项目地址: https://gitcode.com/GitHub_Trending/fa/faiss Faiss作为高效的向量相似性搜索与聚类库&am…...
3大核心功能:告别网盘下载限速的终极解决方案
3大核心功能:告别网盘下载限速的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅…...
