java.sql.Exception:setString 只能处理少于 32766 个字符的字符串

废话不多说,先给我的解决方案,将ojdbc14.jar换成ojdbc6.jar,问题解决。

解决心酸史
报错内容:

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

你可能感兴趣的:(oracle,setString,setClob)