Java 适用于更新的DB2 JDBC查询不适用于batchUpdate
我试图在一个程序中实现批处理更新,我想我可能在DB2JDBC驱动程序中遇到了一个bug或其他问题。我的问题是:Java 适用于更新的DB2 JDBC查询不适用于batchUpdate,java,spring,jdbc,db2,zos,Java,Spring,Jdbc,Db2,Zos,我试图在一个程序中实现批处理更新,我想我可能在DB2JDBC驱动程序中遇到了一个bug或其他问题。我的问题是: 插入CONTENTSOURCE(CONTENTSOURCE\u ID,CS\u NAME)值(?,加密(转换为VARCHAR(280)用于位数据)) 下面是我对springJdbcTemplate的调用,用于单个插入,它可以工作 query = QUERY_INSERT_ENCRYPT; insert.update( query,
插入CONTENTSOURCE(CONTENTSOURCE\u ID,CS\u NAME)值(?,加密(转换为VARCHAR(280)用于位数据))
下面是我对springJdbcTemplate
的调用,用于单个插入,它可以工作
query = QUERY_INSERT_ENCRYPT;
insert.update(
query,
new Object[] {
contentSourceId,
contentSourceObject.getContentSourceName()
.getBytes() });
但是,当我批量尝试相同的操作时,我会得到一个似乎不适用于我的查询的错误
insertArgs.add(new Object[] { contentSource.getContentSourceId(),
contentSource.getContentSourceName().getBytes() });
returnArray = batchInsert.batchUpdate(QUERY_INSERT_ENCRYPT, insertArgs);
当运行batchUpdate时,每一行都会得到一个SQLCODE-312,但我不会对变量做任何事情。下面是从异常中刮取的一些错误的输出
Server error message: A NON-ATOMIC INSERT STATEMENT ATTEMPTED TO PROCESS MULTIPLE ROWS OF DATA, BUT ERRORS OCCURRED
--------------- SQLCA ---------------
Error code: -254
SQLERRMC: INSERT
token 0: INSERT
SQLERRP: DSNXRINS
SQLERRD(1): -400
SQLERRD(2): 0
SQLERRD(3): 0
SQLERRD(4): -1
SQLERRD(5): 0
SQLERRD(6): 0
SQLSTATE: 22530
Server error message: VARIABLE <unknown> IS NOT DEFINED OR NOT USABLE
--------------- SQLCA ---------------
Error code: -312
SQLERRMC: <unknown>
token 0: <unknown>
SQLERRP: DSNXRIHS
SQLERRD(1): -996
SQLERRD(2): 0
SQLERRD(3): 0
SQLERRD(4): -1
SQLERRD(5): 0
SQLERRD(6): 0
SQLSTATE: 42618
服务器错误消息:非原子INSERT语句试图处理多行数据,但出现错误
---------------SQLCA---------------
错误代码:-254
SQLERRMC:插入
令牌0:插入
SQLERRP:DSNXRINS
SQLERRD(1):-400
SQLERRD(2):0
SQLERRD(3):0
SQLERRD(4):-1
SQLERRD(5):0
SQLERRD(6):0
SQLSTATE:22530
服务器错误消息:变量未定义或不可用
---------------SQLCA---------------
错误代码:-312
SQLERRMC:
令牌0:
SQLERRP:DSNXRIHS
SQLERRD(1):-996
SQLERRD(2):0
SQLERRD(3):0
SQLERRD(4):-1
SQLERRD(5):0
SQLERRD(6):0
SQLSTATE:42618
我在很久以前发现了一个不同级别/版本的驱动程序的错误修复,所以我很困惑这是否是同一个问题。
相关摘录:
所有连接:一个SQLCODE312(-312)与
“SqlSyntaxErrorException:未定义变量
运行PureQuery客户端时报告“或不可用”
与DB2z/OS的静态执行模式连接上的优化器
版本8或以上。这个问题与环境有关
驱动程序使用的多行插入(MRI)支持
连接到DB2 z/OS时实现executeBatch()
版本8或以上。在本例中,语句是绑定的
动态执行模式无MRI,但
使用MRI格式错误地执行静态
执行模式。(115716)
那么,我是做错了什么,还是驱动程序可能出了问题,我应该向IBM提出一个问题?看起来您的一个变量超过280个字符,或者可能无法使用getBytes方法(使用默认字符集)对其进行解释。这可以解释“变量未定义或不可用”错误。每行得到-312的事实可能表明实际上没有提交任何内容(所有内容都已回滚)。这可能与驱动程序/数据库有关(请看一看),此时,我只使用测试数据,所有这些数据都是愉快的路径值,因为批处理更新尚未工作。如果我没有弄错的话,-312是关于SQL中定义的变量,我使用的SQL是完全不相关的。这也不能解释为什么使用完全相同的SQL的完全相同的数据可以逐行插入,但在批处理中失败。我只能说:尝试小批量(仅插入2次)并逐渐增加插入的数量。我在测试中一次尝试了1、2和3行,每一行都有相同的sqlcode-312,并且在使用JdbcTemplate batchUpdate方法之前,每一行的数据都已通过使用JdbcTemplate更新方法成功验证。除了驱动程序本身有一个bug之外,我看不到其他选择。你试过最新的驱动程序了吗?