Coherence*Extend连接异常处理与多远程代理配置问题咨询
问题1解决方案:缓存服务宕机时客户端正常操作数据库
要实现缓存服务不可用不影响业务,可按以下步骤配置:
- 首先在Hibernate配置中添加参数
hibernate.cache.coherence.fail_silent,值设为true。开启该参数后,所有缓存操作抛出的异常都会被静默处理,直接视为缓存未命中,请求会直接下发到数据库执行,不会导致业务CRUD失败。如果是Spring Boot项目可在application.properties中配置spring.jpa.properties.hibernate.cache.coherence.fail_silent=true,原生Hibernate则在hibernate.cfg.xml中添加对应property节点即可。 - 调整Coherence缓存配置的连接容错参数:
- 在
initiator-config下添加<connect-timeout>2s</connect-timeout>,缩短连接超时判定时间 - 在
outgoing-message-handler下添加<request-retry-count>3</request-retry-count>,单次请求失败后自动重试3次,避免偶发网络波动导致的异常 - 给
remote-cache-scheme添加服务故障策略配置:<service-failure-policy>exit-service</service-failure-policy>,当确认服务不可用时自动退出远程缓存服务,不会重复发起无效连接请求
- 在
问题2解决方案:多优先级远程代理+全故障时停用缓存
- Coherence原生支持按配置顺序的优先级代理切换:你可以在
tcp-initiator下的name-service-addresses节点中按优先级从高到低添加多个socket-address节点,客户端会按顺序尝试连接,前一个代理故障会自动尝试下一个。 - 所有代理都不可用时自动停用缓存:在
remote-cache-scheme下添加<fallback-scheme>配置,指定故障时降级到本地空缓存方案,配合前面的fail_silent参数即可实现缓存完全不可用时,直接停用缓存功能,所有请求走数据库。
修改后的完整配置示例
<?xml version="1.0"?> <!-- Copyright (c) 2020, Oracle and/or its affiliates. Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl. --> <cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-config coherence-cache-config.xsd"> <caching-scheme-mapping> <cache-mapping> <cache-name>org.hibernate.cache.internal.StandardQueryCache</cache-name> <scheme-name>remote</scheme-name> </cache-mapping> <cache-mapping> <cache-name>query.*</cache-name> <scheme-name>remote</scheme-name> </cache-mapping> <cache-mapping> <cache-name>org.hibernate.cache.spi.UpdateTimestampsCache</cache-name> <scheme-name>remote</scheme-name> </cache-mapping> <cache-mapping> <cache-name>*</cache-name> <scheme-name>remote</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <!-- 远程缓存方案 --> <remote-cache-scheme> <scheme-name>remote</scheme-name> <service-name>ExtendTcpCacheService</service-name> <service-failure-policy>exit-service</service-failure-policy> <initiator-config> <tcp-initiator> <name-service-addresses> <!-- 按优先级从高到低排列代理地址 --> <socket-address> <address>192.168.1.100</address> <port>7574</port> </socket-address> <socket-address> <address>192.168.1.101</address> <port>7574</port> </socket-address> </name-service-addresses> <connect-timeout>2s</connect-timeout> </tcp-initiator> <outgoing-message-handler> <request-timeout>5s</request-timeout> <request-retry-count>3</request-retry-count> </outgoing-message-handler> </initiator-config> <!-- 远程缓存不可用时降级到本地空缓存,相当于停用缓存 --> <fallback-scheme> <local-scheme> <unit-calculator>FIXED</unit-calculator> <high-units>0</high-units> </local-scheme> </fallback-scheme> </remote-cache-scheme> </caching-schemes> </cache-config>
内容的提问来源于stack exchange,提问作者ahmed hamza
相关产品推荐
相关产品推荐

