今日Oracle及Hibernate问题总结

 1、java.sql.SQLException:无法从套接字获取更多的数据

故障情景描述:
           由于业务需求更改,数据库中一张表突然新增几十列,目前该列总数超过100列。数据前台展示使用Dorado DataTable,前台页面也按要求新增若干列,然后刷新页面突然页面出现脚本错误,查看后台控制台,出现异常: java.sql.SQLException:无法从套接字获取更多的数据

            此情况,我记得自进入编程世界以来,从未谋面。于是百度查阅到,可能会由于网络,数据库参数配置等各种因素影响。于是回到电脑桌前,目视控制台。【由于应用和数据库是分别部署在两台服务器上,开发是通过远程协助从客户端浏览器调试的】。基于此情况,我于是试着在服务器端打开浏览器,频繁刷新该页面都未报错。但令人疑问的是为什么客户端浏览器出现这种情况呢?
            我也没办法了,于是咨询总部相关技术人员,介绍此情况:技术人员提供说可能是由于客户网络设置因素,可以通过在自己笔记本部署该程序,然后通过另一台笔记本访问我的应用,是否出现此问题。
            挂了电话后,我认为此方法从现实情况出发不显示,程序在人家客户服务器,又没法导出来,再说在自己机器模拟,手头又没带笔记本,这可怎办?于是我把Dataset绑定的sql通过PLSQL执行。如下

             
 
此情况是这样的,上图中子查询中如果执行是没问题的,整个SQL语句执行也是没问题的;但是整个SQL执行后,点击,点击图中红色图标,等SQL执行查询后,然后再执行一下整个SQL就会查询途中Error. ORA-03133:通信通道的文件结尾.. 这是什么情况,难道是这个表中列太多的缘故吗?
           我试着把最里层的子查询返回列返回1、2列,整个SQL然上述步骤依然出现此Error. Fuck.什么玩意?还没遇见过这个问题呢!!!
于是我通过With把子查询提取出来,如下图所示:

今日Oracle及Hibernate问题总结_第1张图片
 按如上步骤,就不再出现此Error.似乎我没有找到为何会出现此Error的原因,但是我猜测到可能是因为返回列太多的缘故吧,或者其它原因吧。但是我换种方式就解决此问题了。

2、字符串缓冲区太小

             该业务模块中有一个存储过程,存储过程中使用动态SQL基于一个复杂的SQL查询创建一个临时表,但是调用此存储过程时,竟然报异常了,说是字符串缓冲区太小,Fuck,一个问题刚解决,又一个问题接踵而至。
          于是我调试存储过程,发现程序执行拼加sql时,进入异常中,提示如上异常。这是什么情况,我把动态sql又摘出来,执行一下,没问题啊。 我想到可能是自己定义的变量V_SQL     VARCHAR2(4000),长度太4000啊,但是我知道一个表中如果定义为varchar2类型,最大长度是4000,于是我把4000改成8000,编译一下sql块,竟然执行通过了,然后再调用此存储过程,没问题了。

3、ORA-00932:数据类型不一致:应为NUMBER,但却获得BINARY 
今日Oracle及Hibernate问题总结_第2张图片 

         我知道此问题是数据类型转换的原因,但是我查看了一个Dataset以及POJO及其Hbm映射文件,仔细排查没问题啊,最后通过一步步调试,最终发现:
         我的数据类型在POJO中是java.lang.Double类型,但是在执行方法中获取某属性时是null,而数据库中该字段是NUMBER类型,执行的HQL是动态的,于是判断是由于null无法转换成数值类型而导致的。 

你可能感兴趣的:(今日Oracle及Hibernate问题总结)