笔者工作中需要使用多种信创数据库,在使用过程中发现一些问题,现记录如下。
1 OceanBase-Oracle租户的Python连接方式
用Python连接OB数据库的mysql租户可以使用连接mysql的包,但连接oracle租户是没有官方包的,必须使用基于jdbc的jaydebeapi连接。如果想使用sqlalchemy框架,还需要结合sqlalchemy_jdbcapi包使用。注意sqlalchemy_jdbcapi在pypi中的版本是1.2.2(sqlalchemy-jdbcapi · PyPI),不支持OB数据库。需要通过github下载最新版本13.0才可支持(GitHub - daneshpatel/sqlalchemy-jdbcapi: SQLAlchemy dialect for JDBC supported database. (Using JDBCAPI))。
2 OB-Oracle关闭自动提交
使用jaydebeapi+sqlalchemy_jdbcapi连接OB-Oracle数据库时,默认是自动提交的,但很多场景下需要在程序里执行提交、回滚等操作,需关闭自动提交。方法是在jaydebeapi源码的class Connection中加入
self.jconn.setAutoCommit(False)
3 OB-Oracle设置批量插入
默认情况下插入记录到数据库中是单条插入的,速度极慢,需要在sqlalchemy_jdbcapi的jdbcurl中加入
?rewriteBatchedStatements=true
可参考OB社区的jdbc其他参数。https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013604
4 OB-Oracle的主键自增拖慢插入速度
笔者最初设计表结构时将主键设置为用序列自动生成自增主键,但发现速度极慢。猜测是由于OB采用分布式部署,序列需要在多台机器之间通讯保证序列唯一性,因此拖慢速度。如果读者遇到这种问题,可修改为其他方式产生主键,如uuid生成。或者将序列的cache设置大一些,默认的cache有些小。
5 达梦Python官方连接包插入数据报错
用达梦官方py连接库(sqlalchemy_dm)连接达梦,在插入1条数据且其中包含自增列时,源码的逻辑是需要从原数据中取到该列当前值。但源码中没有指定schema,导致如果目标表并不是连接时默认的schema将报错“表或视图不存在”。应该在拼接select的时候加上table.schema,才可正确查询到表。
6 达梦Python官方连接包提示session request timeout
在用达梦官方连接包执行操作时,经常提示session request timeout。在sqlalchemy中设定参数connection_timeout为一个比较大的值(如3600)后出错状况才有缓解。虽然其文档中提示connection_timeout没加限制,但背后可能还是加了限制,需要手动修改此参数。