当前位置: 首页 > Web前端 > HTML

SpringBoot整合oceanbase,实现oracle无缝切换到oceanbase

时间:2023-03-29 12:00:36 HTML

SpringBoot集成oceanbase,实现oracle到oceanbase的无缝切换有些项目可能需要数据库迁移。Oceanbase作为蚂蚁集团完全自主研发的国产原生分布式数据库,在TPC-C核心TPC-H测试中取得了刷新世界纪录的辉煌成绩,连续9年稳定支撑双11。例如淘宝、花呗、芝麻信用等已经投入使用。具有云原生、强一致性、与mysql、oracle高度兼容等特点。非常适合一些需要迁移到本地化数据库的项目。本文以Springboot+Mybatis-plus为技术栈,通过实战讲解oracle到oceanbase的迁移过程,希望对有需要的朋友有所帮助。Springboot集成Oceanbase的前提是:Oceanbase数据库与Oracle数据库高度兼容,可以通过Oracle租户进行几乎无成本的数据库迁移。1.引入依赖由于Oceanbase数据库驱动包还没有上传到maven的中央仓库mvnrepository,需要从Oceanbase官方获取。博主上传到百度云的依赖包(推荐):Oceanbase依赖包下载项目中引入依赖,可以在本地导入依赖,也可以将获取的jar包上传到公司私服,然后坐标引用。本文案例是本地导入的:com.alipay.oceanbaseoceanbase-client2.2.7.2system${basedir}/src/main/resources/lib/oceanbase-client-2.2.7.2.jar2、添加数据库连接配置配置信息如下:url:jdbc:oceanbase://ip:port/schemenameusername:username@tenantname#clusternameorclustername:tenantname:usernamepassword:passworddriver-class-name:com.alipay.oceanbase.jdbc.Driver参数详解说明,oceanbaseusername相对于其他数据库连接,其组成比较特殊,支持两种写法:username@tenantname#clusternameorclustername:tenantname:username。如果想使用obclient命令行连接oceanbase,可以参考:使用obclient连接oceanbase数据库三、在Mybatis-plus框架中处理异常完成以上两步后,就可以使用Mybatis等正常情况下的持久数据库。层框架执行数据库的增删改查等操作。但是,如果项目中使用了Mybatis-Plus框架,还需要额外处理以下问题。场景复现:项目迁移前,使用Mybatis-Plus框架中的API操作Oracle数据,完成分页功能查询。切换到Oceanbase的oracle租户后,执行原函数时会出现语法问题。提示信息是因为使用了oceanbase。oracle租户不支持限制语法。排查问题:跟踪Mybatis-plus源码后发现,在获取数据库方言时,是根据配置文件中连接数据库url中的协议进行匹配的,这样即使使用了oceanbase的oracle组合,设置方言的时候会匹配到oceanbase方言,而不是oracle方言,导致语法问题。解决方案:Mybatis-plus的分页依赖PaginationInnerInterceptor插件,可以继承该类重写数据库的dialect方法,使得数据库连接url为oceanbase协议时返回的dialect为oracle,从而使项目可以由oracle数据库支持。无缝切换到oceanbase的oracle租户,重写代码如下:@Slf4j@Configuration(value="PaginationInnerInterceptor")publicclassPaginationInnerInterceptorConfigextendsPaginationInnerInterceptor{/***数据库类型*/privateDbTypedbType;/***方言实现类*/privateIdialect方言;/***重写获取分页方言类的逻辑,使oceanbase的oracle租户可以使用oracle方言*@return分页方言类*/@OverrideprotectedIdialectfindIDialect(Executorexecutor){StringjdbcUrl=null;尝试{Connectionconn=executor.getTransaction().getConnection();jdbcUrl=conn.getMetaData().getURL();//项目使用oceanbase的oracle租户,方言必须使用oracle,否则会出现语法问题IDialecttempDialect=DialectFacstory.getDialect(DbType.ORACLE);返回临时方言;}if(dialect!=null){returndialect;}if(dbType!=null){dialect=DialectFactory.getDialect(dbType);返回方言;}returnDialectFactory.getDialect(JdbcUtils.getDbType(executor));}catch(Exceptione){returnDialectFactory.getDialect(DbType.OTHER);}}}四、数据库方言问题导致原项目无法无缝切换,那么数据库方言到底是什么?为什么需要它?方言:在通俗的理解中,方言就是具有一定地方特色的语言。它通常只被某些地区的人所认可。不同的地方可以存在不同的方言,就像粤语在广东,壮语在广西。数据库中的方言可以理解为在遵循统一的SQL规范的前提下,不同的扩展实现,如MySQL、Oracle等,在不同的实现中,可能有相同或不同的语法,如分页语法:mysql使用limit,oracle然后用rownum5.设置dialect的必要性对于ORM框架(mybatis,jpa),上层统一封装,乱调用,比如分页功能,不管是什么类型的数据库bottomlayer,在ORM框架中是调用特定的API接口,但是在实际的bottom层中,需要根据使用的数据库调用不同的DBAPI,所以需要在ORM中指定使用哪种dialect。比如上面提到的Mybatis-plus框架就是通过数据库连接的url中的关键字来设置数据库的方言。同时可以使用数据库方言优化查询,实现分页语句和计数语句的自动生成,方言会生成更高效的适合特定数据库的SQL语法。6.数据库驱动和方言数据库驱动:是实现连接数据库的协议(ODBC、JDBC)的程序。它是一个将通用接口连接到供应商特定实现的适配器,就像打印机驱动程序一样。方言:数据库方言是独立于平台的软件(JPA、Hibernate等)的配置设置,允许此类软件将其通用SQL语句转换为供应商特定的DDL、DML。区别:即“数据库驱动”是一个公认的行业术语,具体含义单一,而“数据库方言”则没有类似的认识,因此在不同的上下文中指代不同的概念。写在最后随着世界格局的动荡,为避免在关键时刻“卡壳”,开发自主可控的国产软件势在必行。作为数据库的核心部分,需要更多有抱负的人来构建一个健康的生态系统。先生们参加。Oceanbase作为一个完全自研的本地化分布式数据库,确实是想要迁移本地化的项目和想要实现全本地化的公司的参考选择。