ESB企业服务总线平台作为支撑企业综合集成的产品,在应用集成、数据集成、数据治理等解决方案都发挥着非常重要的作用。随着产品和解决方案的不断优化和升级,ESB企业服务总线平台功能需要逐步进行完善,不断提升产品功能的完备性、易用性和全面性。
为了更好的适配企业大数据量的使用要求,近期对ESB产品的应用数据库类型进行了扩展,原来的产品只支持MySQL数据库,升级后可以兼容Oracle数据库。在升级的过程中涉及到了部分文件的修改和配置,下面进行介绍说明。
1总体概述
本文将对如何升级ESB产品适配Oracle数据库进行介绍,并对升级Oracle数据库进行需求分析,介绍在什么场景下需要调整,以及具体实现思路。由于两个数据库中的语法有部分不一样,所以需要对于不同的数据库类型进行适配。
1.1总体概述
本次开发需要参照原ESB中的MySQL数据库对应升级兼容Oracle数据库。MySQL数据库具有体积小、速度快、成本低等优势,开放源码更是使其大受欢迎。Oracle数据库具有移植性好,使用方便、功能强等优势,各种相应的开发工具或者可视化工具都比MySQL多些。二者语法上的差异并不是很大,都是一些细枝末节,脚本基本围绕增、删、改、查等基本操作,所以对于这种脚本转换的语法需要进行细致的了解并修改。
1.2场景说明
原ESB产品已经有Oracle数据库初始化文件,但一直使用MySQL数据库进行开发,增添了很多SQL数据,本次主要把MySQL数据库的数据同步转移到Oracle数据库并且实现用户切换数据库时可以自动切换成对应数据库类型的SQL语句执行。目前MySQL数据库的文件为“mysql.sql”文件,Oracle数据库的文件为“oracle.sql”文件,需要把这些文件的数据导入到Oracle数据库,进行升级开发。
1.3实现思路
对于如何进行Oracle数据库的升级步骤介绍说明。
1.在Oracle创建ESB库(本次升级的Oracle版本为12c);
2.导出MySQL的数据库结构;
3.通过Navicat数据传输功能把MySQL数据同步到Oracle;
4.修改数据库配置文件:
(1)修改dataSource.type=sqlmap4oracle;
(2)修改数据库连接改成Oracle数据库连接;
5.对应sqlmap4oracle目录进行调整,把sqlmp里的xml文件复制到sqlmap4oracle目录下;
6.修改xml里的sql语句改成能够Orcale在运行的SQL(调整顺序先调整首页和登录页面的,再根据ESB功能模块调整)。
7.运行ESB产品功能,全生命周期对功能测试调整。
2数据同步
首先需要在Oracle数据库中做一些前置工作,包括创建表空间以及用户,并把MySQL数据库中的初始化数据进行数据传输到Oracle中。
2.1创建数据
Navicat是数据库可视化连接工具,该工具可以连接各种数据库如MySQL和Oracle。在MySQL中,数据库和用户之间的关系不是特别明显,只要我们连接到MySQL服务器,就可以看到所有的数据库和表,而Oracle新建一个用户没有任何资源和权限,需要我们为其分配资源权限,也可以在这个用户下面建立表,但不能像Oracle那样建数据库,因为对Oracle来说,一个用户就对应MySQL的一个数据库。所以迁移数据库,需要在Oracle中创建一个与相应MySQL数据库同名的用户。
使用Navicat创建Oracle表空间和用户,主要是在Oracle创建ESB表空间和用户。
1.打开Navicat工具,连接数据库,这里连接的是本地数据库做演示连接数据库:
起一个连接名,这个名称可任意,然后输入用户名和密码,点击测试连接,最后点击确定。
2.连接数据库后,进行创建表空间。选中自己刚刚创建的数据库连接,点击其他,其他中有表空间选项,点击表空间即可进入创建操作表空间页面。
先选择表空间类型,表空间类型有以下几种:
这里选择的是永久表空间。信息填写完毕,点击左上角保存即可。
3.创建用户(注意:注意用户名需要设置为全大写英文字母),默认表空间设置为刚刚新建的表空间:
4.配置服务器权限。
5.登陆测试连接,登录刚新建的用户,就可以连接到新配置的表空间。输入刚刚创建的用户名和密码,点击测试连接即可。
2.2调整要点
两种数据库存在一定的区别,下面将对调整的要点进行介绍:
1.字段类型:MySQL数据库与Oracle数据库的字段有着很多不同,需要将MySQL的字段类型替换成Oracle对应的字段。
2.语法区别:MySQL数据库与Oracle数据库的语法有着很多不同,需要将MySQL的语法替换成Oracle对应的语法,例如:MySQL用AS起别名,而Oracle直接用空格代替。
3.函数替换:MySQL数据库与Oracle数据库的语法有着很多不同,需要将MySQL的函数替换成Oracle对应的函数。
2.3同步数据
通过Navicat数据传输功能把MySQL数据同步到创建的Oracle数据库中。左侧是MySQL数据库,右侧是Oracle连接。
选择高级,把创建表勾选取消,转换对象选择大写,遇到错误继续选择把正确的先导进去。
3配置调整
对于ESB产品的一些数据库配置需要进行调整,底层代码中需要查询的部分也需要进行两种数据库的兼容。
3.1引入依赖
接下来对底层Oracle驱动jar包如何调整进行介绍。全部文件需要复制到ESB产品文件夹下的“\shared”文件夹中,删除原“ojdbc6.jar” jar包文件,如果服务是启动状态的,替换后需要进行ESB产品重启。需要添加调整的jar包名如下:
3.2配置文件
接着对数据库配置文件进行修改,对数据库配置文件进行调整如下:
1.数据类型修改成Oracle,修改数据库连接改成Oracle数据库连接:
2.修改对应数据库配置文件改成Oracle驱动的,填写用户名、密码。
3.3月表创建
修改ServiceContext.xml下添加属性:
调整之后验证ESBServer的启动。来到“/bin”目录下的startup.bat文件,进行ESB产品的启动,查看月表是否创建成功。
4调整过程
该模块对于升级调整顺序进行介绍,并对文件如何调整进行总结说明,最后对MySQL升级Oracle的具体语法区别进行总结。
4.1调整规划
把要进行调整的代码内容进行规划。
1.首先是登录、权限、首页相关。
2.然后依照下面升级顺序调整:
(1)系统管理、系统资源;
(2)服务工程、API管理、应用集成;
(3)运行监控、统计分析、文件传输。
4.2配置调整
在对产品的xml文件进行调整之前,首先需要将原来系统支持的MySQL相关的xml文件复制后调整为对应的Oracle数据库相关的xml文件,下面进行简要说明。
1.sqlmap同目录下有一个sqlmap4oracle目录。
2.把sqlmp里的xml文件复制到sqlmap4oracle目录下。
4.3语句修改
MySQL和Oracle两者的语句有部分不同,所以需要把MySQL中能用但Oracle中不能用的函数或类型等改为Oracle中能用的类型,以下是总结出的部分语法区别:
1.CREATE DATABASE/TABLE IF NOT EXISTS(创建数据库中不存在的数据表):
MySQL直接判断是否存在数据库X,若不存在就建立该数据库,通过用户X,使用该数据库。Oracle通常使用可视化工具Database Configuration Assistant(数据库配置助理,DBCA)创建数据库。
MySQL中大量使用该语句,简单实用安全可靠,通常搭配后面紧跟的“CREATE TABLE”,但是Oracle不支持该语法,只有DROP TABLE,需要注意的是没有该表的时候直接DROP会报错。
2.INSERT INTO...VALUES/SELECT(插入语句):
插入语句的转化由下例给出,Oracle不支持 “\”作为转义符;DATE类型需要说明格式;当使用查询“SELECT”时,没有括号;注意MySQL的插入值是一对多(VALUES值有多个)还是一对一,Oracle不支持一对多。
3.FUNCTION/PROCEDURE:MySQL和Oracle对于函数/存储过程的定义语法不同。
4.不能有``符号,注释另外添加。
5关键要点
对于本次升级的过程中,走了很多的弯路,遇到了很多问题,下面由字段处理、语法区别、SQL文件的等三方面进行介绍其中的关键点。
5.1字段处理
对于字段的处理需要将MySQL中的一些字段转换成Oracle数据库支持的字段,具体对应关系如下表:
5.2语法区别
对于两种数据库中语法的区别,下面由几个关键点进行介绍:
1.对于语句中包含AS的需要去除AS,直接“空格 别名”即可:
MySQL语句:
Oracle语句:
2.分页语句修改
Oracle可通过rownum获取前n条记录,MySQL通过limit来获取前n条记录,但二者的写法略有不同,在Oracle中rownum作为where条件的一部分,而MySQL中limit不是where条件的一部分。
MySQL语句:
SELECT * from fw_department limit 3;查询前3条数据
SELECT * from fw_department limit 2, 4;从第2(序号从0开始)条开始,查4条记录
Oracle语句:
SELECT * FROM XJ_STUDENT WHERE ROWNUM = 1;查询第一条数据
SELECT * FROM XJ_STUDENT WHERE ROWNUM <= 10;获取前10条数据
但rownum不支持查询后几条或第n(n>1)条数据,例如以下sql是不支持的
SELECT * FROM XJ_STUDENT WHERE ROWNUM > 2
SELECT * FROM XJ_STUDENT WHERE ROWNUM = 3
3.日期相关:
(1)区别:
(a)MySQL:可以用Date类型的日期进行比较;
(b)Oracle:必须用to_date()函数和to_char()函数配合转换成统一格式的日期字符串,然后进行比较;
(2)获取方式:
(a)MySQL:可以用YEAR(),MONTH(),NOW()等函数获取年/月/当前日期等;
(b)Oracle:必须用to_char(sysdate, ’yyyy'),to_char(sysdate, 'MM')获取;
(3)日期转换:
(a)MySQL:DATE_FORMAT(t.CZSJ,'%Y-%m-%d');
(b)Oracle:to_char(t.CZSJ,'yyyy-mm-dd')。
4.对于“”的使用
MySQL中“”是对于字符串传值的引用,而Oracle中假如建立对象的时候,对象名、字段名加双引号,则示意 Oracle将严格区分大小写,否则Oracle都默认大写。
5.3SqlMap
对于SQL文件的空值需要进行处理,MySQL的非空字段也可以存储空的内容,而Oracle里定义了非空字段就不容许有空的内容。按MySQL的NOT NULL来定义Oracle表结构,导数据的时候会产生错误。因此insert或者update数据时要对空字符进行处理。
Oracle的insert语句添加“:NULL”,这里需要注意的是需要添加对应的数据类型:
6分析总结
接下来会从升级心得、注意事项以及心得总结三个方面介绍本次ESB产品升级Oracle数据库的心得体会。
6.1升级心得
在导入数据之前,需要导入建表DDL语句。首先,查询建表DDL语句。然后将该数据库的DDL语句导入到SQL语句中。然后修改DDL语句:修改表格名。然后执行该语句,即可生成相同表格结构和索引的数据库。
如果是Oracle数据库的话,也可以稍微修改一下DDL建表语句,复用索引即可。然后导出数据到CSV格式中。然后导入到ORACLE数据库中。这种方式的好处可跨数据库、跨格式、支持所有协议,稳定性很强,能保留索引。
6.2注意事项
在升级过程中遇见的语法区别有很多细节,期间也会遇到很多问题,下面以一些常见问题为例进行介绍。
(1)对于需要使用order by(分组函数)的语句,需要将函数进行删除利用其他语句进行组合(MySQL中可以用属性进行分组过滤,而Oracle中分组函数只能对查到的所有字段进行);
(2)Sql语句中的双引号改成单引号;
(3)对于CONCAT()连接函数,需要两个属性拼接一次进行使用(MySQL语法中可以连续多个拼接,而Oracle中需要两两拼接,涉及到多数据拼接的时候需要进行嵌套,才能正常使用)。
6.3产品价值
ESB 应用集成平台能够消除信息系统之间的“信息孤岛”情况,集中进行应用管理维护,打破系统壁垒,实现各系统间数据、功能的互通,提高系统使用的便捷性。同时可以与公司的很多产品进行组合形成多种方案,满足企业的多样化的需求。
而作为一款好的产品需要具备持续的增长能力,在保持初心和践行长期主义的前提下不断的迭代更新,使得用户有更好的体验,而数通畅联的ESB产品为了达到更好的效果,需要不断地完善,经过更多地打磨与验证,这样才能具有更高的核心竞争力。