Apollo的Oracle适配
Apollo的Oracle适配改动
这几天工作需要使用Apollo配置中心。Apollo唯一的依赖是MySQL数据库,然而公司只有Oracle数据库资源。这里有一个Oracle适配改动的分支,但是它是基于0.8.0版本的Apollo。看着Apollo官方文档上各种特性都只有1.0.0以上版本才有,我决定基于当前最新版本(1.2.0)自己改一波。
基础
在开始改动前我们需要了解Apollo工程的整体结构,以及调试启动的方法。建议本地先搭建个MySQL库,然后把Apollo跑起来看看。官方对此有详细的文档。
另外,从MySQL到Oracle,一个比较大的问题是Apollo中很多表名、字段名和Oracle的关键字有冲突,导致无法在Oracle建表。这个问题可以使用双引号来解决。我们知道,Oracle的SQL语句在解释时会把所有的字符都转为大写(字符串常量除外),所以我们一般认为Oracle的SQL语法不区分大小写。比如说我可以用如下SQL建表:
create TaBle aPplicAtiOn(...);
最终我们会得到一张名为APPLICATION的表。在一些情况下,我们会需要区分大小写的表名,这时候我们可以在建表时用双引号将表名括起来:
create TaBle "aPplicAtiOn"(...);
这样,我们就真正得到了名为aPplicAtiOn的表了。同理,字段名、同名等Oracle对象也都可以用双引号来区分大小写。关于Oracle双引号,这里有更多的讲解。
Oracle适配改动
下面的改动大部分是参考已有的vanpersl/apollo基于0.8.0的Oracle版本的代码。这里是他的修改内容。
总体来说改动量不大。我大约花了一天的时间完成了整个改动。下面是改动步骤。
准备数据库用户
- 准备两个Oracle用户(Oracle用户相当于MySQL的库),分别用于存放配置数据(假设这个用户叫ApolloConfig)和管理数据(假设这个用户叫ApolloPortal)。配置数据和管理数据有很多表名是相同的,所以必须使用两个用户。你也可以使用两个现有的用户,但是要注意不要和现有的表冲突了。
- 使用Oracle的SQL脚本建表。这里是我整理后的两个SQL脚本,ApolloConfig用户执行apolloconfigdb.sql脚本,ApolloPortal用户执行apolloportaldb.sql脚本。
Apollo工程加入ojdbc的依赖
- 我测试了ojdbc6和ojdbc7是可以使用的,而ojdbc12则会报版本太低的错误。我最后使用的ojdbc6,因为我最后测试的是ojdbc6就懒得再换了。
- 另外,我在做这一步的时候发现使用Maven源的ojdbc包是无法启动项目的。只能到Oracle官网下载jar包,然后本地引用。ojdbc的依赖添加到parent项目和apollo-common项目。
修改数据库连接配置
- 新建好Oracle的库后,将Apollo配置中原本MySQL的连接配置改为Oracle的连接配置——注意,根据你的部署方式,可能需要修改两处或者三处的连接配置。
spring.datasource.url=jdbc:oracle:thin:@{ip}:{port}:{db}
spring.datasource.username={ApolloConfig|ApolloPortal}
spring.datasource.password={password}
添加Oracle配置。
这些配置改动在apollo-common的application.properties配置文件。
- 添加配置
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver指定使用Oracle驱动 - 如果你的Oracle版本在11c以下(比如10g或者11g),那么还需要添加
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect。否则Hibernate会生成fetch first ? rows only之类的11c才支持的语句导致SQL执行错误。 - 其他的连接池之类的配置。
Sequence
- Apollo的表使用的自增ID作为主键。Oracle没有直接支持自增ID的功能,必须通过Sequence实现。在建表的SQL里已为两个库分别建了名为
ID_SEQ的Sequence。代码中所有的Entity类的id属性都要加上GeneratedValue和SequenceGenerator的配置。Apollo的代码中大部分的Entity类是继承自一个BaseEntity基类的,所以要修改的地方并不多。- 这几个类需要修改:
BaseEntity、ReleaseMessage、InstanceConfig、Instance、UserPO、ConsumerAudit - 如下添加
GeneratedValue和SequenceGenerator两行:
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
@SequenceGenerator(name = "sequence", sequenceName = "ID_SEQ", allocationSize = 1)
@Column(name = "Id")
private long id;
...
} - 这几个类需要修改:
Oracle关键字的问题
这部分的改动最多,也最枯燥。合理利用IDE的replace功能可以极大的提高修改效率。
- 由于原本MySQL的表名列名用了很多Oracle的关键字,所以转到Oracle时所有的表名列名都用双引号括起来。可在
apollo-commom的application-properties配置中加上:
spring.jpa.hibernate.globally_quoted_identifiers=true
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
这样Hibernate的ORM生成SQL语句时就会自动给表名列名都加上双引号。
- 另外,一些在注解里的类SQL语句用到的字段要手工加上双引号。大概有以下这些地方:
- @SQLDelete和@Where的地方
- AuthConfiguration.java中有一堆直接写SQL的
- 所有的isDeleted和id都要改首字母大写
- Namespace有个appId,Item有个key、value、comment,GreyReleaseRule有appId和releaseId
- 其他我还没发现的犄角旮旯
成果
我最后修改的结果上传在这里:https://github.com/sKabYY/apollo。
目前已经平稳运行。后面如果有bug修改或者升级也会更新上去。
Apollo的Oracle适配的更多相关文章
- Apollo的Oracle适配改动
这几天工作需要使用Apollo配置中心.Apollo唯一的依赖是MySQL数据库,然而公司只有Oracle数据库资源.这里有一个Oracle适配改动的分支,但是它是基于0.8.0版本的Apollo.看 ...
- Oracle适配问题解决
问题一:SQL 命令未正确结束 问题二:ORA-00907: 缺失右括号 问题三:mysql函数在Oracle中不适用 问题四:ORA-00936: 缺失表达式 问题五:No serializer f ...
- Apollo,Python,Delphi与Oracle之间的神话关系
在希腊历史上Delphi曾被认为是世界的中心,Apollo杀死Python后将其据为己有,在其神庙上刻有Oracle,曰:Γνωθι δεαυτόν (认识你自己自身关怀,Cognosce te ip ...
- ABP适配Oracle全过程
一.背景 ABP的各类文档在网络上已经非常完善了,唯独缺少与oralce相关的资料,ABP官网也未给出一个较好的Oracle解决方案.正好最近在学习ABP相关知识,对ABP源码结构稍算熟悉,花了些 ...
- 配置NHibernate将枚举保存为Oracle数据库中的字符串
假设有这样一个枚举: /// <summary> /// 字典项类型 /// </summary> public enum DicItemType { [EnumDescrip ...
- Oracle之常见问题诊断方法
Oracle认证:常见问题诊断方法如下: 1.TNS-12154 Error 或ORA-12154 特征:SQL*NET没有找到连接串或别名 原因1:(1)没有找到TNSNAMES.ORA文件,该文件 ...
- 基于OGG的Oracle与Hadoop集群准实时同步介绍
版权声明:本文由王亮原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/220 来源:腾云阁 https://www.qclou ...
- [转]oracle for update和for update nowait的区别
1概念小结:(针对以下引用区域内容) 1.1 普通select语句不加锁. 1.2 for update和for update nowait都试图将符合条件的数据加上行级锁.用于排斥其他针对这个表的写 ...
- 他们都没告诉你适配 Android N 需要注意什么
还记得 6.0 对 Apache Http 库的废除导致的应用崩溃吗?还记得 6.0 中 MAC id 始终返回为空导致的唯一 id 混合生成算法大幅失效吗? 1. Android 中 Java 的实 ...
随机推荐
- File类_深度遍历文件夹_练习
遍历指定目录下的所有文件和文件夹 import java.io.File; public class FileTest { public static void main(String[] args) ...
- CentOS 7下安装Python3.6.4
CentOS 7下安装Python3.5 •安装python3.6可能使用的依赖 yum install openssl-devel bzip2-devel expat-devel gdbm-deve ...
- UCML JS函数说明
UCML JS函数说明1.调用父窗体函数 window.openerWindow.函数名 2.公用JS存放位置 BPObject\Model\Rule\initvalue.js 3.弹窗JS var ...
- oracle SQL 执行顺序
Oracle执行SQL查询语句的步骤 1.SQL正文放入共享池(shared pool)的库缓存(library cache). 2.检查是否有相同的SQL正文,没有就进行以下编译处理,否则跳过. 1 ...
- Objective-C 锁
多线程在Objective-C项目中占有很大的比重,它能提高程序的运行效率,但也因此带来线程安全问题.而锁就是解决线程安全问题最常用的武器. 锁有很多种. 1.NSLock,非递归锁 NSLock * ...
- Linux下NTP服务器配置
简介 原理 配置ntp服务器 进行同步 一.简介 在计算时间的时候,最准确的计算应该是使用『原子震荡周期』所计算的物理时钟了( Atomic Clock, 也被称为原子钟 ),这也被定义为标准时间(I ...
- Java原子类AtomicInteger实现原理的一点总结
java原子类不多,包路径位于:java.util.concurrent.atomic,大致有如下的类: java.util.concurrent.atomic.AtomicBoolean java. ...
- ddos,cc 攻击特征研究
a.关于DDos攻击的常见方法 1. SYN Flood:利用TCP协议的原理,这种攻击方法是经典最有效的DDOS方法,可通杀各种系统的网络服务,主要是通过向受害主机发送大量伪造源IP和源端口的SYN ...
- 方差(variance)、标准差(Standard Deviation)、均方差、均方根值(RMS)、均方误差(MSE)、均方根误差(RMSE)
方差(variance).标准差(Standard Deviation).均方差.均方根值(RMS).均方误差(MSE).均方根误差(RMSE) 2017年10月08日 11:18:54 cqfdcw ...
- Luogu3164 CQOI2014 和谐矩阵 异或高斯消元
传送门 题意:给出$N,M$,试构造一个$N \times M$的非全$0$矩阵,其中所有格子都满足:它和它上下左右四个格子的权值之和为偶数.$N , M \leq 40$ 可以依据题目中的条件列出有 ...