前言:公司数据库统一切换为oracle,减少部署mysql,现需要将Apollo的数据库做oracle适配,当前使用版本为Apollo2.0.0,网上找到最新版本的适配oracle的版本也仅为1.4.0,现决定自己适配。
部分参考了官方介绍的改造文档:https://github.com/apolloconfig/apollo/compare/v0.8.0...vanpersl:db-oracle
Apollo版本 2.0.0
Oracle版本:12c
0.oracle添加用户和数据库
添加俩用户
APOLLOPORTALDB 默认数据库为APOLLOPORTALDB
APOLLOCONFIGDB 默认数据库为APOLLOCONFIGDB
1.添加oracle驱动,替换掉mysql驱动
搜索引入mysql驱动的地方,删除后添加oracle驱动
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>12.2.0.1</version>
</dependency>
2.修改默认jdbc驱动
# DataSource
#spring.datasource.hikari.connectionInitSql=set names utf8mb4
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect
3.原先数据库初始化脚本改造
3.1 因为oracle不加双引号默认字段和表名会转成大写,所以干脆全转成大写
3.2 oracle索引全局不能重复,但是Apollo不同表索引名有重复的,给每个表索引名称加表名前缀
3.3 oracle不支持自增,SPRING_SESSION表用到了自增,所以需要通过oracle的序列实现自增,这个官方有说明 https://github.com/spring-projects/spring-session/blob/faee8f1bdb8822a5653a81eba838dddf224d92d6/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-oracle.sql
最终修改完的SQL会最后上传
4.Hibernate框架的字段表映射统一转大写加双引号
并且解决原先字段中包括oracle关键字问题
添加类
package com.ctrip.framework.apollo.common.utils;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
public class OracleUpperCaseStrategy extends PhysicalNamingStrategyStandardImpl {
private static final long serialVersionUID = 1383021413247872469L;
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
// 将表名全部转换成大写,加双引号解决字段或表名是oracle关键字
String tableName = "\"" + name.getText().toUpperCase() + "\"";
return name.toIdentifier(tableName);
}
@Override
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {
// 将字段全部转换成大写,加双引号解决字段或表名是oracle关键字
String columnName = "\"" + name.getText().toUpperCase() + "\"";
return name.toIdentifier(columnName);
}
}
添加common中application.properties配置,关联上面的转换类
spring.jpa.hibernate.naming.physical-strategy=com.ctrip.framework.apollo.common.utils.OracleUpperCaseStrategy
spring.jpa.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
5.Spring Security认证的SQL修改
查找JdbcUserDetailsManager,将 ` 符号全部删除。因为oracle不识别