关于某项目数据库迁移的设计方案
原创2017/5/26大约 2 分钟
关于某项目数据库迁移的设计方案
1、业务背景
- 现有某项目采用的是
SpringMVC+Hibernate+Oracle的技术架构 - 项目复杂、数据量很大(传感器等设备数据大概会在千万级别)
- 现有实体的主键都是
java.util.Long类型
2、需求目标
由于使用的 Oracle 数据库收费,为了降低企业的成本,需要切换成其他数据库进行存储,具体使用什么数据库需调研并分析可行性。
3、需求分析
首先,由于数据量大,遂考虑采用 NoSql 类型的 MongoDB 数据库存储。但是进一步发现 Spring Data MongoDB 中的自增主键仅支持 String 类型及原生类型(如 int、long 等且需手动维护),现有主键目前是 Long 型,因此,整个项目完全采用 MongoDB 方案不可行。
于是乎思考,只是部分表数据量大(3个表左右),能不能把所有数据量大的表使用 MongoDB 存储,数据量小的则用 MySQL 存储,也就是同时使用两个数据库进行存储。
4、解决方案
(1)3个数据量大的表采用 MongoDB 存储,其余使用 MySQL 存储
(2)把以上3个表的主键修改为 String 类型(其他处依赖较少),它们对应的 dao 中保留原有的 Hibernate 实现方式,并添加 MongoDB 数据的实现方式,在配置文件中配置只扫描 MongoDB 的实现类
通过以上两步,这样 Service 层以上基本无改动,底层只是新增了三个表的 MongoDB 实现类,从而达到了数据迁移的最终目的。
注意,这里有个问题记录一下,就是在使用 Spring Data MongoDB 进行条件查询的时候,传递的是实体属性名称,貌似 Spring Data 框架内部对该名称进行了首字母小写的处理;因此,实体类的属性名若以大写开头,则查询时会报找不到该字段的错误。所以在命名的时候一定要按照驼峰规范。

