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的Oracle适配改动 这几天工作需要使用Apollo配置中心.Apollo唯一的依赖是MySQL数据库,然而公司只有Oracle数据库资源.这里有一个Oracle适配改动的分支,但是 ...
- Oracle适配问题解决
问题一:SQL 命令未正确结束 问题二:ORA-00907: 缺失右括号 问题三:mysql函数在Oracle中不适用 问题四:ORA-00936: 缺失表达式 问题五:No serializer f ...
- 【实战】静默安装-oracle 11.2.0.3 on centos 5.10
发现网上静默安装的文章非常多,乱七八糟,五花八门!来个扫盲的! centos 5.10 下安装oracle 11g_r2 ************************************* ...
- oracle HA 高可用性具体解释(之中的一个)
oracle HA 高可用性具体解释(之二,深入解析TAF,以及HA框架) :http://blog.csdn.net/panfelix/article/details/38436197 一.HA F ...
- apollo客户端springboot实战(四)
1. apollo客户端springboot实战(四) 1.1. 前言 经过前几张入门学习,基本已经完成了apollo环境的搭建和简单客户端例子,但我们现在流行的通常是springboot的客户端 ...
- 使用yum高速部署Oracle安装环境(11g)
基于Linux安装过Oracle的童鞋们都应该清楚,安装Oracle的确是一件比較费时费力的差事,由于不过前期的rpm包,内核參数,创建用户等等这些个步骤都让那些新手不免眼花缭乱,一不留神.就导致终于 ...
- Centos6.5下Oracle 11g R2安装过程
1准备 CentOS-6.5-x86_64-bin-DVD1 linux_11gR2_database_1of2 linux_11gR2_database_2of2 VMware Workstatio ...
- Oracle SEQUENCE 具体说明
ORACLE SEQUENCE ORACLE没有自增数据类型,如需生成业务无关的主键列或惟一约束列,能够用sequence序列实现. CREATE SEQUENCE语句及參数介绍: 创建序 ...
- Oracle 数据库的组成(instance+database)
Oracle服务器是一种对象关系数据库管理系统,它为信息管理提供开放.综合.集成的方法. Oracle服务器中有多种进进程.内存结构和文件: Oracle服务器由一个Oracle实例和一个Oracle ...
随机推荐
- Python档案袋( Json、pickle、加密与解密)
Json是各程序通用的数据格式:pickle是Python特有的,可以存储很多Python特有的数据,如函数地址等 Json的简单使用: import json jsondata={ "us ...
- 【Spark篇】---Spark中Transformations转换算子
一.前述 Spark中默认有两大类算子,Transformation(转换算子),懒执行.action算子,立即执行,有一个action算子 ,就有一个job. 通俗些来说由RDD变成RDD就是Tra ...
- Hystrix针对不可用服务的保护机制以及引入缓存
之前我写过一篇博文,通过案例了解Hystrix的各种基本使用方式,在这篇文章里,我们是通过Hystrix调用正常工作的服务,也就是说,Hytrix的保护机制并没有起作用,这里我们将在HystrixPr ...
- solr之环境配置二
安装配置Tomcat 下载Tomcat压缩包 我下载的是7.0.55版本. 1.Tomcat 7.0 的免安装版的配置(假如将Tomcat 解压到C:\Program Files目录,目录结构为:C: ...
- .netcore使用SocketAsyncEventArgs Pool需要注意!
在.net中做网络通讯往往都会用到SocketAsyncEventArgs,为了得到更好的性能配合Pool复用SocketAsyncEventArgs可以得到一个更好的效果,但在dotnet core ...
- JAVA数组和集合谁是儿子
Java有哪些数据存储方式? 基本数据类型(1byte3整2小数1字符1布尔)分别是byte,short,int long,flort,double,char,boolean(颜色好喜庆的样子O(∩_ ...
- What can university bring to you?
前言 大学真的是一个神奇的地方,它能带给你的东西超乎你的想象. 当我刚进大学的时候,觉得它和初中,高中,没什么不同,就只是换了地方而已,但是当我现在从里面出来之后,才真的发现,我已经真的不是当年那个自 ...
- LeetCode专题-Python实现之第7题:Reverse Integer
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- 基本 SQL 之增删改查(二)
上一篇文章中,我们介绍了 SQL 中最基本的 DML 语法,包括 insert 的插入数据.update 的更新数据.delete 的删除数据以及基本的查询语法,但大多比较简单不能解决我们日常项目中复 ...
- Tomcat常用的过滤器
前言 之前我很肤浅的以为为了实现某种请求过滤功能(比如图片转换.文件上传.安全认证等),都需要自己去实现javax.servlet.Filter.之后在web.xml中配置即可. 但事实上,Tomca ...