甲骨文& JDBC:使用Clobs时的AbstractMethodError

时间:2016-03-09 20:58:34

标签: java oracle jdbc

所以我在CLOB和Oracle方面遇到了很大的问题。到目前为止,我公司一直用于这个客户端的数据库刚刚通过PreparedStatement传递了简单的字符串。这很好,因为这些字符串都少于4,000个字符。我们刚刚发现存在限制。不是100%肯定为什么,相信它与CLOB的行为方式有关。无论如何,我已被分配进入代码并解决此问题。

因此,目前,PreparedStatement的参数通过一个非常简单的过程分配:

((PreparedStatement) stmt).setObject(fieldIndex++, fieldInfo.value);

现在已经足够好了,但显然没有那么多。

无论如何,我首先想到的是尝试使用一些与CLOB相关的PreparedStatement方法。 fieldInfo.value是Object的声明类型,其实际类型是动态设置的。到目前为止,它已被保存为字符串,正如我所说,所以我决定只更改其类型,然后使用其中一个PreparedStatement方法来分配它。

我尝试过以下类型值& PreparedStatement方法:

if(fieldInfo.value instanceof InputStream){
    ((PreparedStatement) stmt).setBinaryStream(fieldIndex++, (InputStream) fieldInfo.value);
}

if(fieldInfo.value instanceof Reader){
    ((PreparedStatement) stmt).setCharacterStream(fieldIndex++, (Reader) fieldInfo.value);
}

if(fieldInfo.value instanceof Clob){
    ((PreparedStatement) stmt).setClob(fieldIndex++, (Clob) fieldInfo.value);
}

我显然没有连续调用所有这些,这些只是我单独尝试过的例子。

其中每一个都有相同的结果:AbstractMethodError。在研究该异常后,我发现问题很可能是我的JDBC驱动程序。除了......据我所知,我是正确的。我用ojdbc6&尝试了这个。 ojdbc7,同样的错误。我已经仔细检查了我的类路径以及项目中的每个目录,以获得有关旧罐子藏在那里的任何迹象,我似乎无法找到它。

有没有人知道会发生什么?

2 个答案:

答案 0 :(得分:0)

哇,这真是一个奇怪的问题。有一个旧的甲骨文司机埋在另一个罐子里,这个罐子已经坐了好几年了。啊,遗留应用程序的奇迹还没有出色的代码。

无论如何,看到这个的任何mod都可以关闭这个问题。

答案 1 :(得分:0)

我不知道您要在代码中执行什么命令,是INSERT,UPDATE还是其他命令?
但是,我只是按照手册“JDBC Developer's Guide”,主题“使用LOB和BFILE”==> http://docs.oracle.com/cd/E11882_01/java.112/e16548/oralob.htm#JJDBC28535
一切都很好  他们在文档中写道:

  

在Oracle Database 11g第2版(11.2)中,setBytes,   setBinaryStream, setString ,setCharacterStream和setAsciiStream   PreparedStatement的方法被扩展以增强其能力   使用BLOB,CLOB和NCLOB目标列。

他们说setString必须使用字符串> 4000 char,然后我创建了这个简单的测试用例,我使用了 ojdbc6驱动程序(对于Oracle 11.2),见下文:

CREATE TABLE myclob(
  id int,
  myclob clob
);
================================
public static void main(String ...x) throws SQLException{
    OracleDataSource ods = new OracleDataSource();
    ods.setURL("jdbc:oracle:thin:@//localhost:1521/orcl");
    ods.setUser("test");
    ods.setPassword("test");

    Connection con = ods.getConnection();

    PreparedStatement stmt = con.prepareStatement("INSERT INTO myclob( id, myclob) VALUES (?, ?)");

    StringBuffer str = new StringBuffer();
    for(int i = 0; i<1000; i++)
        str.append("Very long line number = " + i);
    System.out.println( "The length is: " + str.length());
    stmt.setInt(1, 2);
    stmt.setString(2, str.toString());

    stmt.executeUpdate();
    con.commit();

    stmt.close();
    con.close();
}

================================
select length( m.myclob), m.*
from myclob m;

LENGTH(M.MYCLOB)         ID MYCLOB                                                                         
---------------- ---------- --------------------------------------------------------------------------------
           26890          2 Very long line number = 0Very long line number = 1Very long line number = 2Very