java多线程提交DDL语句导致连接超时的问题

【 使用环境 】测试环境
【 OB 数据库-单机模式-租户为oracle 】
【 使用版本 】4.2.1.3
【问题描述】业务库对象1.4万,表超过8000+,另还有视图、序列、索引、分区表等其他对象。我们自己开发了一个脚本升级组件,基于原Oracle生成一套标准的结构,升级组件读这个结构再将转换成OB的语法并在OB上执行。因对象多我们采用了java线程池按对象进行并发(如表间并发,视图间的并发等)来提高执行效率,每个线程负责一个对象的全部DDL的执行,数据库连接采用了druid来管理数据库的连接。
(此方式我们验证过其他数据库:如oracle、达梦、gauss均正常执行。)
但执行一小段时间后,数据库陆续出现connetion time out错误。信息如下:
java.sql.SQLNonTransientConnectionException: (conn=3221688232) Connection timed out
at com.oceanbase.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:122)
at com.oceanbase.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:202)
at com.oceanbase.jdbc.OceanBaseStatement.executeExceptionEpilogue(OceanBaseStatement.java:320)
at com.oceanbase.jdbc.OceanBaseStatement.executeInternal(OceanBaseStatement.java:494)
at com.oceanbase.jdbc.OceanBaseStatement.executeUpdate(OceanBaseStatement.java:821)
at com.oceanbase.jdbc.OceanBaseStatement.executeUpdate(OceanBaseStatement.java:798)
at com.alibaba.druid.filter.FilterChainImpl.statement_executeUpdate(FilterChainImpl.java:2881)
at com.alibaba.druid.filter.FilterAdapter.statement_executeUpdate(FilterAdapter.java:2518)
at com.alibaba.druid.filter.FilterEventAdapter.statement_executeUpdate(FilterEventAdapter.java:321)
at com.alibaba.druid.filter.FilterChainImpl.statement_executeUpdate(FilterChainImpl.java:2879)
at com.alibaba.druid.filter.FilterAdapter.statement_executeUpdate(FilterAdapter.java:2518)
at com.alibaba.druid.filter.FilterEventAdapter.statement_executeUpdate(FilterEventAdapter.java:321)
at com.alibaba.druid.filter.FilterChainImpl.statement_executeUpdate(FilterChainImpl.java:2879)
at com.alibaba.druid.proxy.jdbc.StatementProxyImpl.executeUpdate(StatementProxyImpl.java:231)
at com.alibaba.druid.pool.DruidPooledStatement.executeUpdate(DruidPooledStatement.java:328)

我们反复调整timeout参数及在url中配置参数如connectTimeOut,SocketTimeOut等参数都无效。

1.OB内部DDL执行是否是串型化执行?
2.如果要实现我上述的诉求有没有其他办法或实现方式?

你的问题我们已经收到,稍后会有回复

Oceanbase 内部 DDL 执行是采用并行化执行的方式。DDL 语句会被解析成一系列的 DDL 操作,这些操作会被并发地执行在不同的节点上,以提高执行效率。

OB目前大部分ddl都是串行执行的,4.2.1版本支持建表并行,但视图索引等都是串行的。ddl的等待时间当前是1000s,因此多线程提交ddl语句确实有可能会出现部分ddl因为一直在排队超过1000s报超时。
此外集群的工作线程数量是有限的,高并发发送ddl请求会导致ddl请求占住工作线程不释放,阻碍其他的请求正常执行。对于支持并行的DDL,同时执行的线程数与集群规格相关,也需要对其并行度妥善考虑。
如果希望执行过程中不出现超时,当前版本可以考虑对于建表语句之外的请求降低并行度。获证考虑4.2.2以及4.2.3新支持了更多类型DDL的并行执行的版本。