欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从ORA-22993谈起---论解决问题的方法论 OracleJDBCSQLServletTomcat 

程序员文章站 2024-02-21 12:46:22
...

今天写了个程序要实现:让用户创作模板,而且是带格式的模板,保存起来留作以后使用。所以这些模板的数据要保存到数据库了。 我是这么写的<code>templateVO.setBlobID(blobService.addBlob(blobVO));</code> 基本上意思很清楚就是向Oracle的blob字段里添加一条记录。但是问题来: 每次执行完毕总是报:<code>java.io.IOException: ORA-22993: specified input amount is greater than(ORA-22993: 指定的输入总数大于实际的来源总数)</code> 一番Google,http://blog.csdn.net/lihan6415151528/archive/2009/07/15/4351142.aspx .询问同事后知是Oracle版本的问题,自己使用: <code>select * from v$version; 查询结果: <TABLE BORDER="1"> <TR><TH>BANNER</TH></TR> <TR><TD>Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod</TD></TR> <TR><TD>PL/SQL Release 10.2.0.1.0 - Production</TD></TR> <TR><TD>CORE 10.2.0.1.0 Production</TD></TR> <TR><TD>TNS for 32-bit Windows: Version 10.2.0.1.0 - Production</TD></TR> <TR><TD>NLSRTL Version 10.2.0.1.0 - Production</TD></TR> </TABLE> </code> 果然是驱动不对,我自己的是oracle 9.0.2的驱动classes12.jar 而链接的服务器是10.2.0.1。 寻找到数据库服务器copy到本机,原想就圆满了吧。但:错误码: <code>Cannot create JDBC driver of class 'oracle.jdbc.driver.OracleDriver'/no suitable driver</code> 纵使我找到n多帖子,但是大多数是这个问题都是"Cannot create JDBC driver of class 'oracle.jdbc.driver.OracleDriver' for connect 'null'" 引起的,不是我的情况。自己反复使用9i和10g的包替换,重启,发现只是包的差别,9i就是正常10g不行,也就是这条路也是不行的。 但是我忽然意识到许多人也使用了导入附件的功能,为什么他们好使呢?带着这样的疑问,查看了别人写的导入功能。发现在我的系统上别人的功能也是不好使的;但是在别人的机器上确实好使的。。 这下好办了,就是比较我们两个系统的运行环境呗。jdk都是1.5;tomcat,我的是6,她的是5,这个导致问题的可能性不大;最后发现她使用的Oracle驱动是ojdbc14.jar,查询MANIFEST.MF,Oracle版本是9.0.2.,传到我机器和我的ojdbc比较发现她的是<code>Implementation-Title: "ojdbc14.jar" Implementation-Version: "Oracle JDBC Driver version - 9.0.2.0.0" Implementation-Vendor: "Oracle Corporation" Implementation-Time: "Tue Apr 6 01:10:57 2004"</code> 而我的是<code>Implementation-Title: "ojdbc14.jar" Implementation-Version: "Oracle JDBC Driver version - 9.0.2.0.0" Implementation-Vendor: "Oracle Corporation" Implementation-Time: "Thu Apr 25 23:14:02 2002"</code> 时间跨了2年,大小差30k,最重要的是前者的<code>Name: oracle/sql/BLOB.class Digest-Algorithms: SHA MD5 SHA-Digest: pKeIUjbb0bG29Fp+YyMUnpXdqL0= MD5-Digest: 84Ixh0QhrIJFPxfQJQSlAw==</code> 而我的<code>Name: oracle/sql/BLOB.class Digest-Algorithms: SHA MD5 SHA-Digest: YdCoSwsZJODsKxo8/Im33SiW0eg= MD5-Digest: DG0ZZCIRtwfrRDZ3i6Pslg==</code> 问题找到了使用blob文件不一样,说明我的不兼容的。 之后由遇到了如何判断一字段输入是否大于数据库里的存储——典型的中文字符集问题。 1.页面使用utf8传值到servlet,servlet使用utf8解释,在servlet里看到的是正常的汉字,但是有个问题,这些bytes(不是Byte)是如何被保存到数据库的,使用(<a href="http://phoenix007.iteye.com/blog/278004#comments">这里</a>); <code>select userenv('language') from dual;</code> 发现是gbk的,这下好,知道是1个存2个字段。 问题就到这里。。 其实我想表达是: 我前面使用的策略是——1.直面问题,直到找到原因。可以理解为是直线。就是看产生结果的原因。 2。我使用的绕过的原则。我不需要知道为什么不好使,我只需要知道一种方法,让他好使,那就是抄别人的东西。 两种方式是各有千秋,我喜欢第一种直接,干脆,彻底。但是时间耗费。。 第二种迂回,但是能马上解决问题。。 所以合适的选择解决问题的方案是日常工作生活学习的必备技能。