这段时间公司产品要做跨多数据库适配,由于之前使用MyBatis一直是面向SQL编程,使用了一些MySQL的语法,所以需要改造,上周开会确定了三种方案:
1. Spring Data JPA --- 持久层更换为ORM框架,使用Spring Data JPA+Hibernate组合
2. SQL拦截解析 --- 从数据源层面做SQL拦截,解析语法树,进行改写适配
3. 多方言适配 --- 通过MyBatis标签或者其他形式,对需要支持的数据库特性的SQL语法进行个性化适配
下面来对以上几种方案进行横向比较:
方案/类型(1-5颗星)
|
改造成本
|
开发效率
|
技术难度
|
SQL调优
|
性能
|
可维护性
|
跨多数据库
|
Spring Data JPA
|
★★★
|
★
★
★★★
|
★
|
★
|
★★★★
|
★★★★★
|
★★★★★
|
SQL拦截解析
|
★★★★★
|
★★★
|
★★
★★★
|
★★★★★
|
★★★★★
|
★★
|
★★★
|
多方言适配
|
★★★★
|
★
|
★★★
|
★★★★★
|
★★★★★
|
★
|
★★★
|
一、Spring Data JPA
Spring Data JPA是Spring Data家族的一部分,可以轻松实现基于JPA的存储库,极大地简化持久层开发及数据库切换的成本。
优点:屏蔽数据库底层细节,ORMapping,开发效率高
缺点:SQL难以调优,生成的SQL难以控制,虽然也能使用SQL开发,但是违反了ORM的初衷
二、SQL拦截解析
从数据源层面将MySQL的语法翻译成其他数据库的语法,这种方式需要对各种数据库语法十分熟悉,并且需要长期维护不同的方言转换
优点:代理数据源,不用改造已有的业务
缺点:虽然看起来十分美好,但是难度十分大,方言适配也是不小的开发量
三、多方言适配
就是SQL92/SQL99的基础语法上,再适配数据库的个性化语法,这种方式几乎是(二)的简单版本,需要梳理各种数据库语法以及支持的数据库种类
优点:改造成本低
缺点:可维护性很低,需要确定好支持的数据库种类,后续增加还需要再适配
总体来说,只有(一)比较符合当前需求,存在的问题基本可以接受,(二)、(三)因为技术难度、改造成本和可维护性等问题,基本可以排除