You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ignite与MySQL:更新条目数不符引发日志警告问题

解决Ignite搭配MySQL时INSERT...ON DUPLICATE KEY UPDATE触发的WARN日志问题

首先得明确问题根源:MySQL执行INSERT ... ON DUPLICATE KEY UPDATE更新现有行时,会返回2作为影响行数(这是官方文档明确的行为),但Ignite的CacheAbstractJdbcStore.write方法里硬编码判断影响行数必须等于1,否则就输出WARN日志,而你的场景中这个更新行为完全正常,所以需要消除这个不必要的警告。

下面提供两种可行的解决方案:

方法一:自定义JdbcStore重写write方法(推荐,精准控制逻辑)

你可以继承CacheAbstractJdbcStore,重写write方法,调整影响行数的判断逻辑,适配MySQL的返回规则:

public class CustomMysqlJdbcStore<K, V> extends CacheAbstractJdbcStore<K, V> {
    private static final Logger log = Logger.getLogger(CustomMysqlJdbcStore.class);

    @Override
    protected void write(PreparedStatement stmt, Cache.Entry<K, V> entry) throws SQLException {
        int updCnt = stmt.executeUpdate();
        
        // 适配MySQL的INSERT...ON DUPLICATE KEY UPDATE:允许影响行数为1(插入新行)或2(更新现有行)
        if (updCnt != 1 && updCnt != 2) {
            EntityMapper em = entityMapper();
            U.warn(log, "Unexpected number of updated entries [table=" + em.fullTableName() + 
                ", entry=" + entry + ", expected=1 or 2, actual=" + updCnt + "]");
        }
    }
}

然后在你的缓存配置中,使用这个自定义的StoreFactory替代原来的CacheJdbcPojoStoreFactory,或者调整Store的实现类。这样就能精准适配MySQL的返回逻辑,只在真正异常的情况才输出警告。

方法二:调整日志级别,屏蔽该WARN日志(快速解决)

如果你不想修改代码,可以通过日志配置工具(比如Log4j2、SLF4J等),把CacheAbstractJdbcStore类的日志级别提升到ERROR,这样WARN级别的日志就不会输出了。

以Log4j2为例,在配置文件中添加:

<Logger name="org.apache.ignite.internal.processors.cache.store.jdbc.CacheAbstractJdbcStore" level="ERROR" additivity="false">
    <AppenderRef ref="YourAppender"/>
</Logger>

这样就能直接屏蔽掉这个特定的WARN日志,适合快速解决问题的场景。


内容的提问来源于stack exchange,提问作者Wi-Al

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:26:59