【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】3.2.33
【问题描述】各位大神有没有遇到过这种问题:java应用批量提交数据时间过长。有时候会提交不上报:arguments: -6210, Transaction is timeout的错误。但是批量提交的数据量并不大,只有十多万条,表也不宽,大概十几个字段。使用的OBoracle,这种情况应该怎么解决呢。。。。。
修改超时时间
修改了超时时间后不报错了,就是太慢了,提交十几万条数据要三四十分钟。。这种情况有好点的方法优化吗
把这个事务中的慢sql发出来,你的ob_trx_timeout和ob_query_timeout,调整为多少了。跑批预期的时长是多少,现在的时长是多少
ob_trx_timeout和ob_query_timeout这两个参数值都为10000000000。之前在oracle数据库下是秒级插入的,现在OBoracle模式下大概三十四分钟。这张表没有做分区,数据量大概在五六百万左右。
刚刚又做了一下测试,addBatch本身这个动作也很慢,批量添加后commit提交更慢了。
ocp里看看监控是按照拼接多value执行还是预编译的单sql多值执行的。
或者gv$sql_audit里查,看看慢的原因,等待事件是什么?拿到traceId在observer.log里看看。
如果都不会看,那就找企业版技术支持,买了企业版,应该是有专门的售后技术支持的。
根据目前的信息,不好判断。第一查查全局索引是不是很多,第二试试commit写到循环里,试试单条提交,或者1000条一次提交。OB数据库不建议运行大事务
数据库连接url上加 rewriteBatchedStatements=TRUE参数没,没有的话加上再试试
已经不报错了,就是插入太慢了,索引就一个,循环插入的话,每500条提交一次,14W数据插了四十多分钟。表字段有18个。