本文主要是介绍【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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!