java.sql.Exception:setString 只能处理少于 32766 个字符的字符串
2016-03-18 23:26
591 查看
废话不多说,先给我的解决方案,将ojdbc14.jar换成ojdbc6.jar,问题解决。
解决心酸史
报错内容:
报这个错是因为我在操作数据库的时候,使用PreparedStatement的setString方法时,传入的字符串太大了,代码如下:
于是上网查了一下,发现都没办法解决我的问题。由于我要存入字段在数据库中的类型是CLOB,然后我就想PreparedStatement是否有传CLOB的方法呢,看了下API果然有一个setClob(int parameterIndex, Clob x)方法,然后自己尝试了一下都失败了,就又求助于我谷神了。然后在stackoverflow发现这样一个我正需要的问题,原文地址:
How to use setClob() in PreparedStatement inJDBC
回答中主要介绍了如下方法:
然后我试了一下,结果华丽丽地又报错了:
然后又在万能的stackoverflow找到一个和我的错误类似的问题:
using CLOB in java throwing exception
里面说使用PreparedStatement的setCharacterStream方法来传送长字符串也是极好的,代码如下:
然后我尝试了一下,果然,不报错了!正当我开心的时候,突然发现有些事情不对,过去了5分钟了怎么程序还在运行???关了重新试一下,妈蛋还是卡在那程序就不走了,我在想这不会是表锁了吧,然后进oracle看了一下锁记录果然表锁了,这里如何查询锁表记录以及如何解锁请看我这篇文章:
oracle执行update语句卡住不动
回正题,事实证明使用PreparedStatement的setCharacterStream也是行不通的,然后我又上网找了一下,它说可能是oracle jdbc的jar包版本太低了,最好使用ojdbc6及以上的版本。我看了一下我的JDBCjar包,是ojdbc14.jar,应该对应的是oracle 10,而ojdbc6.jar对应的是oracle 11,然后我换了ojdbc6.jar之后,重新尝试了一下,数据可以入库了,而且经实践,以上PreparedStatement的setString方法、setClob方法以及setCharacterStream都是可以传长字符串的,及时是setString方法也不会报setString 只能处理少于 32766 个字符的字符串这个错了。
哎,整个解决下来,只能说好坑啊。。。
OVER
解决心酸史
报错内容:
java.sql.Exception:setString 只能处理少于 32766 个字符的字符串
报这个错是因为我在操作数据库的时候,使用PreparedStatement的setString方法时,传入的字符串太大了,代码如下:
PreparedStatement pst = null; conn.setAutoCommit(false); pst = conn .prepareStatement("insert into t_meta_sql_file (sql_id, bat_id, file_id, begin_line,end_line,sql_text) values(seq_meta_sql_file.nextval,?,?,?,?,?)"); pst.setString(1, fileNameInfo.getFileBatchId()); pst.setString(2, fileNameInfo.getSubFileBatchId()); pst.setString(3, sql.getBeginLine().toString()); pst.setString(4, sql.getEndLine().toString()); pst.setString(5, sql.getSql().trim()); // 这里传入的字符串是一个存储过程,占了很多个字节
于是上网查了一下,发现都没办法解决我的问题。由于我要存入字段在数据库中的类型是CLOB,然后我就想PreparedStatement是否有传CLOB的方法呢,看了下API果然有一个setClob(int parameterIndex, Clob x)方法,然后自己尝试了一下都失败了,就又求助于我谷神了。然后在stackoverflow发现这样一个我正需要的问题,原文地址:
How to use setClob() in PreparedStatement inJDBC
回答中主要介绍了如下方法:
String str = "some string"; Clob clob = connection.createClob(); clob.setString(1, str); PreparedStatement.setString(index, clob);
然后我试了一下,结果华丽丽地又报错了:
java.lang.AbstractMethodError:oracle.jdbc.T4CConnection.createClob()Ljava
然后又在万能的stackoverflow找到一个和我的错误类似的问题:
using CLOB in java throwing exception
里面说使用PreparedStatement的setCharacterStream方法来传送长字符串也是极好的,代码如下:
StringReader reader = new StringReader(userAbout); PreparedStatement insertClob = dbCon.prepareStatement("UPDATE user_data SET user_about=? WHERE user_id=?"); insertClob.setCharacterStream(1, reader, userAbout.length()); insertClob.setInt(2,userId); int count= insertClob.executeUpdate();
然后我尝试了一下,果然,不报错了!正当我开心的时候,突然发现有些事情不对,过去了5分钟了怎么程序还在运行???关了重新试一下,妈蛋还是卡在那程序就不走了,我在想这不会是表锁了吧,然后进oracle看了一下锁记录果然表锁了,这里如何查询锁表记录以及如何解锁请看我这篇文章:
oracle执行update语句卡住不动
回正题,事实证明使用PreparedStatement的setCharacterStream也是行不通的,然后我又上网找了一下,它说可能是oracle jdbc的jar包版本太低了,最好使用ojdbc6及以上的版本。我看了一下我的JDBCjar包,是ojdbc14.jar,应该对应的是oracle 10,而ojdbc6.jar对应的是oracle 11,然后我换了ojdbc6.jar之后,重新尝试了一下,数据可以入库了,而且经实践,以上PreparedStatement的setString方法、setClob方法以及setCharacterStream都是可以传长字符串的,及时是setString方法也不会报setString 只能处理少于 32766 个字符的字符串这个错了。
哎,整个解决下来,只能说好坑啊。。。
OVER
相关文章推荐
- Java中String类(字符串操作)的10个常见问题和解决方法
- Java命名规范
- mac jdk原因导致 maven命令无法执行
- 【Android开发准备】Windows下JDK的安装与环境变量的配置
- JAVA面向对象之多态性
- 观察者模式学习以及jdk实现
- 关于java 异常捕捉 ( try catch finally ) 执行流程
- Java中Serializable接口和Cloneable接口
- 白话Spring(中级篇)---前端控制器
- java 类加载器
- Java 注解原理以及实例
- 2016蓝桥杯假期任务之《打印十字图》
- No_16_0316 Java基础学习第十九天
- java中异常的限制
- 将eclipse中项目的Text File Encoding设置成为GBK
- spring4+hibernate4+struts2项目整合的步骤及注意事项
- 可恶的Eclipse 一天崩几百遍我都不惊诧
- [疯狂Java]多线程:线程组、线程/组内异常处理
- java(jsp)简单实现数据库学生信息的增删改查案例
- Java学习-用正则表达式判断email是否合法