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

不支持mariadb jdbc驱动程序blob更新,jdbc,driver,mariadb,Jdbc,Driver,Mariadb,在我将mysql jdbc驱动程序5.1替换为mariadb jdbc驱动程序1.1.5并测试了连接mysql Server 5.0和mariadb Server 5.2的现有代码库之后,除了一个jdbc调用来更新表中的blob字段外,一切都正常 blob字段包含XML配置文件。它可以被读取、转换为xml并插入一些值 然后将其转换为ByteArrayInputStream对象,并调用该方法 statement.updateBinaryStream(columnLabel, the ByteArr

在我将mysql jdbc驱动程序5.1替换为mariadb jdbc驱动程序1.1.5并测试了连接mysql Server 5.0和mariadb Server 5.2的现有代码库之后,除了一个jdbc调用来更新表中的
blob
字段外,一切都正常

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

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

statement.updateBinaryStream(columnLabel, the ByteArrayInputStream object, its length) 
但会引发一个异常:

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

我尝试了updateBlob方法,但引发了相同的异常

该代码在mysql jdbc驱动程序5.1中运行良好

有没有关于如何应对这种情况的建议

查看票据,该票据在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();
}
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();
}
但是请注意,您需要一些关于如何唯一标识表条目的信息,在本例中,列idColumn就是用于此目的的。此外,您是否将空流存储在
您可能会得到一个数据库。

一个更简单的解决方法是使用二进制文本(如X'2A4 B54')和连接(更新表集blobcol=blobcol | | X'2A4 B54'),如下所示:

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();
}
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();
}
int-iBUFSIZ=4096;
字节[]buf=新字节[iBUFSIZ];
int长度=0;
int i更新=1;
for(int-iRead=stream.read(buf,0,iBUFSIZ);
(iUpdated==1)和&(iRead!=-1)和&(iLength0)
sValue=sBlobColumn+“| |”+sValue;
字符串sSql=“更新”+sTable+“设置”+sBlobColumn+“=”+sValue;
语句stmt=connection.createStatement();
iUpdated=stmt.executeUpdate(sSql);
stmt.close();
}