MySQL 应用迁移到达梦的适配踩坑点总结
在信创发展的大背景下,越来越多企业着手将基于 MySQL 的应用迁移到达梦数据库。不少应用在开发时采用了 MyBatis-Plus 框架,它作为 MyBatis 的增强工具,以其强大的通用 CRUD 操作、便捷的条件构造器以及实用的分页插件等特性,极大地提升了开发效率 。但在迁移过程中,MyBatis-Plus 与达梦数据库的适配产生了一系列问题,下面我们就来详细梳理这些踩坑点。
一、selectPage 查询的阻碍
在 MyBatis-Plus 执行selectPage操作时,会先执行SELECT COUNT()语句来获取数据总数,以便实现分页功能。但在适配达梦数据库时,该语句无法通过 TableNameHelper 设置模式。这就导致在分页查询时,无法精准获取特定模式下的数据总量,分页功能也因此受到影响。经排查,发现是由于拦截器的执行顺序出现问题,某些关键的拦截器未能在合适的时机对SELECT COUNT()语句进行处理。最终通过调整拦截器顺序,让与 TableNameHelper 相关的拦截器在执行SELECT COUNT(*)语句前生效,成功解决了这个问题。在调整过程中,需要全面梳理各个拦截器的功能和执行顺序,防止对其他数据库操作产生负面影响。
二、大小写问题引发的困扰
使用 MyBatis-Plus 进行查询时,查询结果被自动转换为大写,这在进行columnId匹配时会带来诸多不便。为了解决这个问题,设置了columnNameUpperCase=false参数,试图保持查询结果的大小写。然而,在使用select *时,该参数却未生效,导致数据匹配出现错误,影响业务逻辑的准确性。针对这一情况,经过深入研究发现,达梦数据库在某些查询场景下对连接串参数的解析存在差异。可以尝试在连接达梦数据库时,额外添加一些特定的配置参数,明确指定结果集的大小写规则;或者在数据处理层,对查询结果进行统一的大小写转换处理,确保columnId匹配的准确性。
三、索引创建的难题
在达梦数据库中,索引的管理机制与 MySQL 存在显著差异。当应用借助 MyBatis-Plus 创建索引时,如果索引不是建立在表上,一旦出现相同的 index 名称,后续创建操作将无法进行。同时,通常不建议创建 cluster 索引,因为 cluster 索引可能会对数据的插入和更新性能产生负面影响。在实际开发中,曾遇到在创建多个索引时,由于疏忽导致部分索引名称重复,使得创建操作失败,进而影响了整个数据存储结构的搭建。为避免此类问题,在创建索引前,务必仔细检查索引名称的唯一性,并且在设计索引时,要充分考虑业务需求和数据操作的性能,谨慎选择是否使用 cluster 索引。
四、聚集索引与大字段的冲突
在使用 MyBatis-Plus 创建索引时,可能会遭遇这样的错误:Cause: dm.jdbc.driver.DMException: 第1行附近出现错误: 表[inst_form_f7b3h2kj_design]中不能同时包含聚集KEY和大字段。这是因为达梦数据库对表结构的约束与 MySQL 不同,在达梦数据库中,一个表不能同时包含聚集 KEY 和大字段。为了解决这个问题,在创建索引时,除主键索引外,应避免使用聚集索引。例如,在设计一个包含大字段的用户信息表时,原本计划对某个常用查询字段创建聚集索引以提升查询性能,但在迁移到达梦数据库时,就需要调整设计,将其改为普通索引,从而有效规避此类错误。
五、字符串截断问题
在迁移过程中,可能会遇到字符串截断; nested exception is dm.jdbc.driver.DMException: 字符串截断的问题。经排查发现,原来是之前在 MySQL 中定义为 json 格式的字段,在达梦数据库中需要定义为 TEXT 类型。这是因为两种数据库对数据类型的处理方式存在差异,MySQL 对 json 格式的存储和读取有其特定的机制,而达梦数据库更适合用 TEXT 类型来存储类似的文本数据。在使用 MyBatis-Plus 进行数据迁移时,必须仔细考量不同数据库对数据类型的支持和处理方式,提前对数据类型进行转换,确保数据的完整性和准确性。比如在处理订单详情数据时,若其中包含复杂的结构化信息,在 MySQL 中以 json 格式存储,迁移到达梦数据库时,就需要将对应字段改为 TEXT 类型。
六、TEXT 对象兼容性问题
达梦数据库中的 TEXT 对象,通过 MyBatis-Plus 查询到 Java 中后会变成 DmdbNClob 对象,这与当前的表单体系不兼容,导致在数据展示和处理时出现异常。经过探索,通过设置clobAsString=true参数,成功解决了这一问题。该参数的作用是将 DmdbNClob 对象转换为字符串形式,使其能够与表单体系正常交互。在处理此类问题时,深入了解达梦数据库和 Java 之间的数据类型映射关系,以及如何通过配置参数实现数据类型的正确转换,是关键所在。
七、bool 类型字段的转换
bool 类型的字段,在达梦数据库中需要使用 bit 类型才能自动转换为 bool。这体现了不同数据库在数据类型上的差异,在 MySQL 中,bool 类型可以直接存储和使用,但到达梦数据库中,就需要进行类型转换。在使用 MyBatis-Plus 进行数据迁移和适配时,务必清晰掌握各种数据类型的转换规则,在定义实体类时,将 bool 类型的字段对应为 bit 类型,防止因类型不匹配而导致数据错误。
八、唯一索引校验的差异
在达梦数据库的唯一索引字段中,如果值为 Null,也会触发唯一索引校验报错,这与 MySQL 的处理方式截然不同。在 MySQL 中,唯一索引字段允许存在单个 Null 值,而达梦数据库则更为严格。在使用 MyBatis-Plus 设计表结构和使用唯一索引时,必须充分考虑到达梦数据库的这一特性。比如在设计用户表的唯一用户名索引时,就需要确保插入的数据中用户名字段不会出现 Null 值,避免因数据中存在 Null 值而导致唯一索引校验失败,影响业务的正常运行。
在将使用 MyBatis-Plus 框架开发的 MySQL 应用迁移到达梦数据库的过程中,会遇到各种各样的问题,这些问题涉及到数据库操作的各个方面。通过对这些踩坑点的总结和分析,希望能够帮助开发者在迁移过程中少走弯路,顺利完成适配工作。同时,在实际迁移过程中,还需要根据具体的业务场景和数据特点,灵活运用各种解决方法,确保迁移后的系统能够稳定、高效地运行。如果在迁移过程中遇到其他问题,也可以参考达梦社区等专业平台,获取更多的技术支持和解决方案。