【MogDB】实战MogDB数据库适配Halo博客系统1.6版本(基于springframework+hibernate+HikariPool)

本文主要是介绍【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的驱动,所以还是得下载源码来进行手动修改了

  1. 克隆halo1.6的代码
git clone -b release-1.6 https://gitee.com/halo-dev/halo.git
  1. 打开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已经停止维护,不会再有升级,因此我们可以把相关的代码完全去掉

  1. 打开.\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就报错了。

  1. 于是,我们把所有的@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目录覆盖过来,并在后台启用主题即可

完整方案

一、代码修改部分

  1. 引入jdbc驱动
  2. 去掉flyway的使用
  3. 把@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

三、数据库部分

  1. 创建PG兼容性的库
create database halo160 dbcompatibility ='PG';\c halo160
  1. 创建连接用户
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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1