背景:
做一个小程序,A表中有600万条数据,每天数据都要经过计算得出一个值,存入B表。数据库是ORACLE。
1、数据查询采用rowid与rownum混合使用,进行分批查询
select t.* from A t,(select rowid rid, rownum rnum from A order by rid) b where t.rowid=b.rid and b.rnum between startTIme and endTime;
2、数据存储采用关闭connection的自动提交和PreparedStatement.executeBatch结合,来进行批量存储
3、采用线程池的方式,每个线程包含一个查询任务、计算任务和一个存储任务(对于一次查询出的数据,可能会多批存储)。
问题:
程序完成后,在进行少量数据测试时无异常,但是多个线程大量数据操作时就会发生以下错误。
DbConnection.close error:ORA-01013: 用户请求取消当前的操作
java.sql.BatchUpdateException: ORA-03106: 致命的双工通信协议错误
java.sql.BatchUpdateException: ORA-12592: TNS: 包错误
ORA-01483: DATE 或 NUMBER 绑定变量的长度无效
java.sql.BatchUpdateException: 无法从套接字读取更多的数据
解决:对于以上报错的,搜索到的结果五花八门。可能是防火墙问题,可能是一次插入的数据太大等等。都尝试过后发现并没有完全解决问题,无意中看到有人说也许是oracle的版本和ojdbc不匹配,尝试替换ojdbc后,问题解决。
1、查询oralce数据库版本
select * from v$version;
2、版本对应关系
|