最近在工作中,分配到的一个项目,一句话概括一下目前的需求就是写一个小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 8i | JDK 1.1.x | classes111.zip | |
Oracle 8i | JDK 1.1.x | classes12.zip | |
Oracle 9i | JDK 1.1.x | classes111.jar或者 classes111.zip | |
Oracle 9i | JDK 1.2 and JDK 1.3 | classes12.jar 或者 classes12.zip | |
Oracle 9i | JDK 1.4 | ojdbc14.jar | |
Oracle 9i | JDK 1.5 | ojdbc5.jar | |
Oracle 9i | JDK 1.6 | ojdbc6.jar | |
Oracle 10g | JDK 1.2 and JDK 1.3. | classes12.jar | |
Oracle 10g | JDK 1.4 and 5.0 | ojdbc14.jar | |
Oracle 11g | jdk5 | ojdbc5.jar | |
Oracle 11g | jdk6 | ojdbc6.jar |
之前的demo里面,用的是classes12.jar;而oracle11g,对应版本推荐是ojdbc6.jar。
果断去maven仓库里面找到了这个jar包,替换了当前的。
解决!
感谢https://www.twblogs.net/a/5b7cc5212b71770a43dc80b3/zh-cn这位兄台的指点。