java适配OceanBase数据库经验总结

技术方案:

  • 数据库:oceanbase(社区版3.1.5),mysql模式
  • java相关:mysql-connector-java驱动版本,官方推荐5.1.47(谨慎使用8.x,不兼容)

经验总结

  1. ob社区版不支持utf8mb4_unicode_ci字符集,因此代码和数据库字符集统一使用utf8mb4_general_ci

  2. flyway暂不支持ob数据库的mysql模式,启动后flyway会调用mysql的GET_LOCK方法,但ob的mysql模式中无此方法,因此需要禁用flywy,如果需要批量跑sql,建议使用shell脚本代替flyway做db版本管理工具,主线预使用存储过程、事务维护数据库版本控制。

  3. 使用jdbcTemplate批量跑sql会报错: java.sql.SQLException: null,该报错不影响sql的执行,使用try语句包起来即可。ob社区的解决方案是将 MySQL Connector/J 换成 5.1.47 版本,并将驱动改为com.mysql.jdbc.Driver 和第5点类似。

  4. 自增主键很大,这是由于ob的分布式架构导致的,ob的自增主键是基于全局的,自增主键会从自增池里获取一批连续递增的号码缓存起来用于自增,用完之后再从自增池获取一批号码,因此自增主键都不会从1开始。

  5. 使用8.x版本的mysql-connector-java会导致batchUpdate后不能insert任何内容,报错内容如下。请切换mysql-connector-java的版本为5.1.47。注意:使用com.mysql.cj.jdbc.Driver 驱动的地方也要改成com.mysql.jdbc.Driver
    在这里插入图片描述

  6. 执行DML脚本,报错 timeout
    原因是ob默认的超时时间是10s,单个事务的时间是100s,总事务时间是120s,而我的DML文件里的sql很长,执行时间过长导致超时。
    可以使用如下sql语句查看

show variables like '%timeout%';

解决办法:
ob支持使用命令更改超时时间,因此,在DML脚本里将超时时间设置大一点即可,我设置了200s
在这里插入图片描述
注意set session的范围是当前会话,重启服务,设置将会被重置,如果需要设置全局永久生效,则需要set global session(需root权限)。

请指正。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐