java适配OceanBase数据库
java适配OceanBase数据库经验总结,一个多模块项目经验。
java适配OceanBase数据库经验总结
技术方案:
- 数据库:oceanbase(社区版3.1.5),mysql模式
- java相关:mysql-connector-java驱动版本,官方推荐5.1.47(谨慎使用8.x,不兼容)
经验总结
-
ob社区版不支持utf8mb4_unicode_ci字符集,因此代码和数据库字符集统一使用utf8mb4_general_ci
-
flyway暂不支持ob数据库的mysql模式,启动后flyway会调用mysql的GET_LOCK方法,但ob的mysql模式中无此方法,因此需要禁用flywy,如果需要批量跑sql,建议使用shell脚本代替flyway做db版本管理工具,主线预使用存储过程、事务维护数据库版本控制。
-
使用jdbcTemplate批量跑sql会报错: java.sql.SQLException: null,该报错不影响sql的执行,使用try语句包起来即可。ob社区的解决方案是将 MySQL Connector/J 换成 5.1.47 版本,并将驱动改为com.mysql.jdbc.Driver 和第5点类似。
-
自增主键很大,这是由于ob的分布式架构导致的,ob的自增主键是基于全局的,自增主键会从自增池里获取一批连续递增的号码缓存起来用于自增,用完之后再从自增池获取一批号码,因此自增主键都不会从1开始。
-
使用8.x版本的mysql-connector-java会导致batchUpdate后不能insert任何内容,报错内容如下。请切换mysql-connector-java的版本为5.1.47。注意:使用com.mysql.cj.jdbc.Driver 驱动的地方也要改成com.mysql.jdbc.Driver
-
执行DML脚本,报错 timeout
原因是ob默认的超时时间是10s,单个事务的时间是100s,总事务时间是120s,而我的DML文件里的sql很长,执行时间过长导致超时。
可以使用如下sql语句查看
show variables like '%timeout%';
解决办法:
ob支持使用命令更改超时时间,因此,在DML脚本里将超时时间设置大一点即可,我设置了200s
注意set session的范围是当前会话,重启服务,设置将会被重置,如果需要设置全局永久生效,则需要set global session(需root权限)。
请指正。
更多推荐
所有评论(0)