本来订单的生成没有问题,但不知什么原因,报了一个这样的异常,致使订单不能生成
[08-11-19 8:07:51:344 CST] 00000037 JDBCException E could not insert: [gmit.jzt.buying.databean.EOrderDO#122594]
[08-11-19 8:07:51:344 CST] 00000037 JDBCException E TRAS0014I: 下列异常已记录 java.sql.SQLException: ORA-01460: 转换请求无法实现或不合理
服务器是WebSphere,想到是价格的计算总价哪里出了问题,设了断点,然后输出,也不曾得出结果,总是报这个异常,后来把那些数据拿到本地测试(Excel导入订单),又出现了一个新的异常
ora-600 kksscl-inf-inl-loop
Connection aborted by peer: socket write error
java.sql.SQLException: 无法从套接字读取更多的数据
就百度了:
http://wmlm.itpub.net/post/12871/454535从此处得知是Oracle9i的驱动要升级了,结果换了驱动包就好了,是一个比较郁闷的问题,问题是解决了,但是我还是不知道为什么换了驱动包就可以了,如果有看到此文章的麻烦解答一下,我也把解决的方法转过来,供大家查阅:
日期:20080203
关键字:
ora-600 kksscl-inf-inl-loop
Connection aborted by peer: socket write error
java.sql.SQLException: 无法从套接字读取更多的数据
内容:
收到开发人员发来的邮件,告知JAVA应用程序 运行系统一段时间后,报“获取数据库连接失败”,“无法从套接字获取更多数据”,要求解决此问题
http://docs.google.com/Doc?id=dgdk3pdk_114cq8x87gw
内容:
收到开发人员发来的邮件,告知JAVA应用程序 运行系统一段时间后,报“获取数据库连接失败”,“无法从套接字获取更多数据”,要求解决此问题
附件中的日志摘抄部分内容如下:
java.sql.SQLException: Io 异常: Connection aborted by peer: socket write error
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:389)
at oracle.jdbc.driver.OracleConnection.privateCreateStatement(OracleConn
ection.java:772)
at oracle.jdbc.driver.OracleConnection.createStatement(OracleConnection.
java:712)
at weblogic.jdbc.pool.Connection.createStatement(Connection.java:356)
......
java.sql.SQLException: 无法从套接字读取更多的数据
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
......
到现场后首先检查报警日志,其中有以下信息:
Sat Feb 02 15:44:06 2008
Errors in file d:oracleadmingljkudumpgljk_ora_3200.trc:
ORA-00600: internal error code, arguments: [kksscl-inf-inl-loop], [1521], [199], [199], [955], [955], [], []
Sun Feb 03 12:26:07 2008
Errors in file d:oracleadmingljkudumpgljk_ora_3364.trc:
ORA-00600: internal error code, arguments: [kksscl-inf-inl-loop], [1521], [23], [23], [103], [103], [], []
通过查看UDUMP下的日志,找出有以下SQL语句:
select yhdm,yhmc,yhmm,dh,qxjgdm,sybz,sydz,fysz,color
from gljk_xt_yhxx t
where yhdm=(select SWRY_DM from P12366_CTAIS2_USER where NAME=:"SYS_B_0")
.......
上网查了一下资料,有以下原因可能会造成此类错误:
1 数据库版本需要升级(目前是9201+windows2000 as)
2 表或索引上有数据坏块
3 SESSION之间的阻塞
4 初始化参数设置
参考metalink文档:ORA-600[kksscl-inf-inl-loop] during heavy load with CURSOR_SPACE_FOR_TIME=TRUE
计划处理此问题的步骤如下:
1 找ORACLE支持(公司不出钱,这一步跳过去)
2 扫描表及索引,查看是否有坏块,如果有,进行坏块修复,或表及索引的重建
3 在应用停了之后,升级数据库到9204,检查以下初始化参数
cursor_space_for_time=false
session_cached_cursors=0
cursor_sharing=force
4 在下次错误发生,查看阻塞的SESSION
如果是因为SESSION阻塞,造成的应用程序中的错误,修改以下初始化参数
- set TIMED_STATISTICS=FALSE
- set _row_cache_cursors=20 or more (10 default)
- don't do any kind of tracing
检查过程:
SQL> select 'ANALYZE TABLE '||table_name||' VALIDATE STRUCTURE CASCADE ;' from user_tables;
发现问题:
SQL> ANALYZE TABLE gs12366_gljk.GLJK_YSWG_LIST VALIDATE STRUCTURE CASCADE ;
ANALYZE TABLE gs12366_gljk.GLJK_YSWG_LIST VALIDATE STRUCTURE CASCADE
*
ERROR 位于第 1 行:
ORA-01499: table/index cross reference failure - see trace file
开发人员还有一些附加的要求:
系统设计的是定期将gljk_yswg_list中的数据删除后放在历史表中(2733918条记录),但总是有一些数据在插入时提示列值过大,而两个表结构一样,也找不到原因.
积累到现在共有205045条记录,
处理过程:
先查看空闲的表空间,确认是否有足够的空间来保存临时数据
1 create table wang_temp1 as select * from GLJK_YSWG_LIST where skssq>'2008' ;
-- 共有87114条
2 create table wang_temp2 as select * from GLJK_YSWG_LIST where skssq<'2008';
-- 共有205045条
3 停掉所有相关的JAVA应用
4 备份表上的建索引脚本,rename table GLJK_YSWG_LIST;
5 rename table ww_temp1 to GLJK_YSWG_LIST;
6 运行创建索引脚本,补充上索引.(表上没有触发器,如果有,还需要还原)
7 进入测试查询
8 将wang_temp2中的数据插入到历史表GLJK_YSWG_HISTORY_LIST中.如果批量插入失败,写一个简单的存储过程进行插入,并捕捉不能插入的记录,分析原因进行解决.
9 处理完毕后,删除中转表wang_temp1 wang_temp2
在此做个记录,以供以后出现类似问题时参考.