并发修改了部分键



我使用的是Ignite 2.13。x作为我的一个要求,我需要在Ignite集群中维护缓存,一些键值将并发更新,选择也并行发生。所以这里我面临的问题是,

java.sql。SQLException:更新一些键失败,因为它们被并发修改了[keys=[ROWKEY [idHash=628930863, hash=1637498765, ROWKEY =6, id=765436]]org.apache.ignite.internal.jdbc.thin.JdbcThinConnection.sendRequest (JdbcThinConnection.java: 1009)org.apache.ignite.internal.jdbc.thin.JdbcThinStatement.execute0 (JdbcThinStatement.java: 234)org.apache.ignite.internal.jdbc.thin.JdbcThinPreparedStatement.executeWithArguments (JdbcThinPreparedStatement.java: 252)org.apache.ignite.internal.jdbc.thin.JdbcThinPreparedStatement.executeUpdate (JdbcThinPreparedStatement.java: 96)在sun.reflect.GeneratedMethodAccessor56。调用(未知源)sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java: 43)java.lang.reflect.Method.invoke (Method.java: 498)org.apache.tomcat.jdbc.pool.StatementFacade StatementProxy.invoke美元(StatementFacade.java: 118)在com.sun.proxy。Proxy16美元。executeUpdate(未知源)

这是在服务器端使用的配置,

<bean class="org.apache.ignite.configuration.IgniteConfiguration"
id="igniteConfiguration">

<property name="cacheKeyConfiguration">
<list>
<bean class="org.apache.ignite.cache.CacheKeyConfiguration">
<property name="typeName" value="ROWKEY" />
<property name="affinityKeyFieldName" value="rowkey" />
</bean>
</list>
</property>

<property name="clientMode" value="false" />
<property name="gridName" value="6d-ignite-grid"></property>
<property name="cacheConfiguration">
<list>
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="persons"></property>
<!-- Set cache mode. -->
<property name="cacheMode" value="PARTITIONED" />
<!-- Set number of backups to 0 -->
<property name="backups" value="0" />
<property name="onheapCacheEnabled" value="false" />
<property name="statisticsEnabled" value="true" />
<property name="memoryPolicyName" value="Default_Region" />
<property name="copyOnRead" value="false" />
<property name="writeSynchronizationMode" value="FULL_SYNC" />
<property name="affinity">
<bean
class="org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction">
<property name="excludeNeighbors" value="true" />
<property name="partitions" value="10" />
<property name="affinityBackupFilter">
<bean
class="org.apache.ignite.cache.affinity.rendezvous.ClusterNodeAttributeAffinityBackupFilter">
<constructor-arg>
<array value-type="java.lang.String">
<value>AVAILABILITY_ZONE</value>
</array>
</constructor-arg>
</bean>
</property>
</bean>
</property>
<property name="queryEntities">
<list>
<bean class="org.apache.ignite.cache.QueryEntity">
<property name="keyType" value="ROWKEY"></property>
<property name="valueType" value="PERSONS"></property>
<property name="fields">
<map>
<entry key="rowkey" value="java.lang.Long"></entry>
<entry key="id" value="java.lang.Long"></entry>
<entry key="name" value="java.lang.String"></entry>
<entry key="birthday" value="java.lang.String"></entry>
<entry key="gender" value="java.lang.String"></entry>
<entry key="amount" value="java.lang.Long"></entry>
<entry key="salary" value="java.lang.Long"></entry>
<entry key="orgid" value="java.lang.String"></entry>
</map>
</property>
<property name="keyFields">
<set>
<value>rowkey</value>
<value>id</value>
</set>
</property>
</bean>
</list>
</property>
</bean>
</list>
</property>
<property name="includeEventTypes">
<list>
<!--Task execution events -->
<util:constant
static-field="org.apache.ignite.events.EventType.EVT_TASK_STARTED" />
<util:constant
static-field="org.apache.ignite.events.EventType.EVT_TASK_FINISHED" />
<util:constant
static-field="org.apache.ignite.events.EventType.EVT_TASK_FAILED" />
<util:constant
static-field="org.apache.ignite.events.EventType.EVT_TASK_TIMEDOUT" />
<util:constant
static-field="org.apache.ignite.events.EventType.EVT_TASK_SESSION_ATTR_SET" />
<util:constant
static-field="org.apache.ignite.events.EventType.EVT_TASK_REDUCED" />
<!--Cache events -->
<util:constant
static-field="org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_PUT" />
<util:constant
static-field="org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_READ" />
<util:constant
static-field="org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_REMOVED" />
</list>
</property>
<property name="peerClassLoadingEnabled" value="true"></property>
<property name="discoverySpi">
<bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
<property name="ipFinder">
<bean
class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
<property name="addresses">
<list>
<!-- In distributed environment, replace with actual host IP address. -->
<value>127.0.0.1:47500..47509</value>

</list>
</property>
</bean>
</property>
</bean>
</property>
<property name="memoryConfiguration">
<bean class="org.apache.ignite.configuration.MemoryConfiguration">
<property name="defaultMemoryPolicyName" value="Default_Region" />
<property name="pageSize" value="4096" />
<property name="systemCacheInitialSize" value="#{40 * 1024 * 1024}" />
<property name="systemCacheMaxSize" value="#{40 * 1024 * 1024}" />
<property name="memoryPolicies">
<list>
<bean
class="org.apache.ignite.configuration.MemoryPolicyConfiguration">
<property name="name" value="Default_Region" />
<property name="initialSize" value="#{20 * 1024 * 1024}" />
<property name="maxSize" value="#{20 * 1024 * 1024}" />
<property name="pageEvictionMode" value="RANDOM_2_LRU" />
<property name="evictionThreshold" value="0.6" />
<property name="metricsEnabled" value="true" />
</bean>
</list>
</property>
</bean>
</property>
</bean>

谢谢你的帮助Ajay Babu Maguluri。

错误消息表明在操作执行期间并行更新了该值,应该重试失败的操作。在对缓存中的同一键进行并发原子更新的情况下,预计会出现这种类型的错误。或者您可以使用事务作为避免这种情况的替代方法。

同样,你可以在这里找到更多关于缓存原子性模式的细节:https://ignite.apache.org/docs/latest/configuring-caches/atomicity-modes atomicity-modes

最新更新