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
相关产品推荐
相关产品推荐

