繁体   English   中英

在Ignite缓存中插入数据时出现以下错误?

[英]Getting following error while inserting data in Ignite cache?

如果我使用String而不是JsonObject,则在缓存值中使用JsonObject(GSON库)时会发生此错误,则操作成功执行。

在缓存中插入数据时遇到的错误:

javax.cache.CacheException: class org.apache.ignite.transactions.TransactionRollbackException: Transaction has been rolled back: 9557fcfb061-00000000-078a-a446-0000-000000000001
    at org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1287)
    at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.cacheException(IgniteCacheProxyImpl.java:1648)
    at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.put(IgniteCacheProxyImpl.java:1008)
    at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.put(GatewayProtectedCacheProxy.java:872)
    at com.clouzer.databaseoperation.DataBaseOperation.getAllUSerGson(DataBaseOperation.java:527)
    at com.mstorm.ignition.gson.LoginCacheOperation.createLoginCache(LoginCacheOperation.java:38)
    at com.mstorm.ignition.gson.IgniteCacheCreator.createCaches(IgniteCacheCreator.java:30)
    at com.mstorm.ignition.gson.IgniteServer.main(IgniteServer.java:102)
Caused by: class org.apache.ignite.transactions.TransactionRollbackException: Transaction has been rolled back: 9557fcfb061-00000000-078a-a446-0000-000000000001
    at org.apache.ignite.internal.util.IgniteUtils$11.apply(IgniteUtils.java:860)
    at org.apache.ignite.internal.util.IgniteUtils$11.apply(IgniteUtils.java:858)
    ... 8 more
Caused by: class org.apache.ignite.internal.transactions.IgniteTxRollbackCheckedException: Transaction has been rolled back: 9557fcfb061-00000000-078a-a446-0000-000000000001
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter.syncOp(GridCacheAdapter.java:4054)
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter.put0(GridCacheAdapter.java:2340)
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter.put(GridCacheAdapter.java:2321)
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter.put(GridCacheAdapter.java:2298)
    at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.put(IgniteCacheProxyImpl.java:1005)
    ... 5 more
Caused by: class org.apache.ignite.IgniteCheckedException: Can not set final com.google.gson.internal.LinkedTreeMap field com.google.gson.JsonObject.members to java.util.LinkedHashMap
    at org.apache.ignite.internal.util.IgniteUtils.cast(IgniteUtils.java:7252)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.resolve(GridFutureAdapter.java:259)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:171)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:140)
    at org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$10.applyx(GridNearTxLocal.java:2396)
    at org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal$10.applyx(GridNearTxLocal.java:2392)
    at org.apache.ignite.internal.util.lang.IgniteClosureX.apply(IgniteClosureX.java:38)
    at org.apache.ignite.internal.util.future.GridFutureChainListener.applyCallback(GridFutureChainListener.java:78)
    at org.apache.ignite.internal.util.future.GridFutureChainListener.apply(GridFutureChainListener.java:70)
    at org.apache.ignite.internal.util.future.GridFutureChainListener.apply(GridFutureChainListener.java:30)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:383)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.listen(GridFutureAdapter.java:353)
    at org.apache.ignite.internal.util.future.GridFutureAdapter$ChainFuture.<init>(GridFutureAdapter.java:572)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.chain(GridFutureAdapter.java:358)
    at org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal.optimisticPutFuture(GridNearTxLocal.java:2391)
    at org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal.putAsync0(GridNearTxLocal.java:622)
    at org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal.putAsync(GridNearTxLocal.java:385)
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter$22.op(GridCacheAdapter.java:2342)
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter$22.op(GridCacheAdapter.java:2340)
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter.syncOp(GridCacheAdapter.java:4040)
    ... 9 more

缓存配置:

CacheConfiguration<String, JsonObject> cacheConfig = new CacheConfiguration<>();
            cacheConfig.setName("CACHE_NAME");
            cacheConfig.setReadThrough(true);
            cacheConfig.setBackups(2);
            cacheConfig.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
            cacheConfig.setWriteThrough(true);
            cacheConfig.setCacheStoreFactory(FactoryBuilder.factoryOf(ObjectLoader.class));
            IgniteCache<String, JsonObject> cache = ignite.getOrCreateCache(cacheConfig);

操作:

1.创建JsonObject(使用GSON库)

2.将缓存加载器设置为用于持久存储的给定缓存

3.从点燃客户端将数据插入缓存

4.观察问题

问题是JsonObject具有类型为LinkedTreeMap members字段,而Ignite BinaryMarshaller (默认值)由于某种原因将其反序列化为LinkedHashMap

为了避免这种情况,可以使用其他编组器,例如OptimizedMarshaller

UPD:

事实证明,如果您配置OptimizedMarshaller ,那么只有从缓存中获取数据才能正常工作。 但是,例如,如果尝试get(...) JsonObject的反序列化表示的某些字段,则JVM将崩溃。

原因是LinkedTreeMap具有以下writeReplace()方法:

private Object writeReplace() throws ObjectStreamException {
    return new LinkedHashMap(this);
}

因此,如果将其序列化,然后反序列化,则将获得LinkedHashMap的实例,而不是LinkedTreeMap的实例。 因此, BinaryMarshaller没有做错任何事情。

摘要:

看起来您不应该将JsonObject放入缓存。 它没有实现Serializable ,因此作者没有考虑对其进行序列化。 我认为,您将必须用JSON字符串替换JsonObject

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM