背景:
做一个小程序,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、版本对应关系
  | 
                  
                  
                  
                  
                            
本文介绍了一个基于Oracle数据库的小程序开发案例,该程序用于每天计算并存储大量数据。开发过程中采用了分批查询、批量存储及多线程处理等技术手段。在实际运行中遇到多种异常情况,最终通过调整使用的ojdbc版本解决了问题。
          
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					655
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            