记录一下工作中遇到的大数据批量入库oracle数据库的问题

  最近在工作中,分配到的一个项目,一句话概括一下目前的需求就是写一个小demo,为以后做准备。demo是要将一个文件夹内的多个文件(一个文件大约23万左右的数据量,大约每个150M),读取出来之后,录入oracle数据库。

  话不多说,我从一个同事那里接到的demo底子,拿过来进行改造。刚接过来时,是传统jdbc的addbatch批量入库处理,然后数据库连接方面是原生获取,手动创建的linkedlist。什么Driver.啥的,,,原谅楼主记不住这些东西,毕竟没用原生JDBC开发过。据说原生JDBC操作大数据量效率能高一些。但是虽然如此,楼主也没见谁开发用原生JDBC的。。。。。

  用这个原始的demo跑了一遍之后,发现可以实现基本需求,就是说假如文件少,数据少的情况下,没什么问题。可以入库。但是当文件数量增加至3个的时候,就出问题了。

  楼主首先是用C3P0连接池替换掉了原本的手工LinkedList的形式

 

  因为我感觉,这种连接池技术肯定比咱们自己手动往list里面放连接要成熟吧。

 

然后,问题来了:

  1.换完连接池后,发现数据量过大时,数据库内存不够了,报错信息:

  ORA-01653 表xxx无法通过8(在表空间xxx中)扩展

  这个解决方式如下:

----查询表空间使用情况---
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC;

--查看表空间是否具有自动扩展的能力
SELECT T.TABLESPACE_NAME,D.FILE_NAME,
D.AUTOEXTENSIBLE,D.BYTES,D.MAXBYTES,D.STATUS
FROM DBA_TABLESPACES T,DBA_DATA_FILES D
WHERE T.TABLESPACE_NAME =D.TABLESPACE_NAME
 ORDER BY TABLESPACE_NAME,FILE_NAME;

-- 为MOOM_DEFAULT_TS表空间增加一个数据文件
ALTER TABLESPACE MOOM_DEFAULT_TS ADD DATAFILE
'/home/oracle/oradata/orcl/moom_default_02.dbf' SIZE 500M
AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED ;

  其中绿色部分的路径,是前两步自己查询出来的,不要盲目模仿。

 

  2.解决完了上个问题之后,就开始爆炸了。

  各种偶发性问题,层出不穷。说不上哪次就蹦出来各种花里胡哨的问题。我记了几个如下:

  oracle ORA-12592: TNS: 包错误

  java.sql.SQLException: 关闭的连接

  java.sql.SQLException: 关闭的语句

  DbConnection.close error:ORA-01013: 用户请求取消当前的操作

  java.sql.BatchUpdateException: ORA-03106: 致命的双工通信协议错误 

  ORA-01483: DATE 或 NUMBER 绑定变量的长度无效 

  java.sql.BatchUpdateException: 无法从套接字读取更多的数据

。。。。。

 

这些问题就真的是x了狗了,百度,谷歌,各种搜解决方式,试过一圈儿,没好使的。后来在谷歌上发现一个老兄说,有可能是oracle版本跟对应驱动jar包的问题,楼主怀着死马当作活马医的形态,试了一下,结果。。。解决了。。。

  首先查看了一下自己的Oracle数据库版本:

select * from v$version;

然后注意看版本对应关系:

Oracle版本jdk版本推荐jar包备注
Oracle 8iJDK 1.1.xclasses111.zip 
Oracle 8iJDK 1.1.xclasses12.zip 
Oracle 9iJDK 1.1.xclasses111.jar或者 classes111.zip 
Oracle 9iJDK 1.2 and JDK 1.3classes12.jar 或者 classes12.zip 
Oracle 9iJDK 1.4ojdbc14.jar 
Oracle 9iJDK 1.5ojdbc5.jar 
Oracle 9iJDK 1.6ojdbc6.jar 
Oracle 10gJDK 1.2 and JDK 1.3.classes12.jar 
Oracle 10gJDK 1.4 and 5.0ojdbc14.jar 
Oracle 11gjdk5ojdbc5.jar 
Oracle 11gjdk6ojdbc6.jar

   之前的demo里面,用的是classes12.jar;而oracle11g,对应版本推荐是ojdbc6.jar。

   果断去maven仓库里面找到了这个jar包,替换了当前的。 

   解决!

   感谢https://www.twblogs.net/a/5b7cc5212b71770a43dc80b3/zh-cn这位兄台的指点。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值