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

2024年 3月 9日 91.4k 0

前言

前一篇文章说了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")

//@Lob

private 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.Driver
url: jdbc:postgresql://127.0.0.1:26050/halo160?stringtype=unspecified&batchMode=off
username: halo
password: Halo@123

jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
properties:
hibernate:
temp:
use_jdbc_metadata_defaults: false

halo:

# Your admin client path is https://your-domain/{admin-path}
admin-path: admin

# memory or level
cache: 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 许可协议。转载请注明出处!

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论