不支持mariadb jdbc驱动程序blob更新

时间:2013-10-02 01:35:10

标签: jdbc driver mariadb

在用mariadb jdbc驱动程序1.1.5替换mysql jdbc驱动程序5.1并测试了与MySQL Server 5.0和MariaDB Server 5.2连接的现有代码库之后,除了用于更新blob字段的JDBC调用之外,一切正常在一张桌子里。

blob字段包含XML配置文件。它可以读出,并转换为xml并插入一些值。

然后将其转换为ByteArrayInputStream对象,并调用方法

statement.updateBinaryStream(columnLabel, the ByteArrayInputStream object, its length) 

但抛出异常:

  

也许你有一些不正确的SQL语法?   java.sql.SQLFeatureNotSupportedException:不支持更新     在   org.mariadb.jdbc.internal.SQLExceptionMapper.getFeatureNotSupportedException(SQLExceptionMapper.java:165)     在   org.mariadb.jdbc.MySQLResultSet.updateBinaryStream(MySQLResultSet.java:1642)     在   org.apache.commons.dbcp.DelegatingResultSet.updateBinaryStream(DelegatingResultSet.java:511)

我尝试了updateBlob方法,抛出了同样的异常。

该代码适用于mysql jdbc驱动程序5.1。

有关如何解决这种情况的任何建议?

2 个答案:

答案 0 :(得分:0)

查看票证updating blob with updateBinaryStream,该票据在commnet中声明不受支持。

解决方法是使用两个SQL语句。一个用于选择数据,另一个用于更新数据。像这样:

final Statement select = connection.createStatement();
try {
    final PreparedStatement update = connection.prepareStatement( "UPDATE table SET blobColumn=? WHERE idColumn=?" );
    try {
        final ResultSet selectSet = select.executeQuery( "SELECT idColumn,blobColumn FROM table" );
        try {
            final int id = selectSet.getInt( "idColumn" );

            final InputStream stream = workWithSTreamAndRetrunANew( selectSet.getBinaryStream( "blobColumn" ) ) );

            update.setBinaryStream( 1,stream );
            update.setInt( 2,id );
            update.execute();
        }
        finally {
            if( selectSet != null )
                selectSet.close();
        }
    }
    finally {
        if( update != null )
            update.close();
    }
}
finally {
    if( select != null )
        select.close();
}

但请注意,您需要一些有关如何唯一标识表条目的信息,在此示例中,列 idColumn 用于此目的。此外,你存储空流 您可能会获得SQLException数据库。

答案 1 :(得分:0)

更简单的解决方法是使用二进制文字(如X' 2a4b54')和连接(UPDATE表格blobcol = blobcol || X' 2a4b54'),如下所示:

int iBUFSIZ = 4096;
byte[] buf = new byte[iBUFSIZ];
int iLength = 0;
int iUpdated = 1;
for (int iRead = stream.read(buf, 0, iBUFSIZ);
     (iUpdated == 1) && (iRead != -1) && (iLength < iTotalLength);
     iRead = stream.read(buf, 0, iBUFSIZ))
{
    String sValue = "X'" + toHex(buf,0,iRead) + "'";
    if (iLength > 0)
        sValue = sBlobColumn + " || " + sValue;
    String sSql = "UPDATE "+sTable+" SET "+sBlobColumn+"= "+sValue;
    Statement stmt = connection.createStatement();
    iUpdated = stmt.executeUpdate(sSql);
    stmt.close();
}