持久性实施 Ignite.net 时出错

error in implementing Ignite.net with persistence

我是 Ignite.net 技术的新手,正在尝试使用数据持久性功能来实现它(将 EF 核心 2.1 用于我的缓存存储 类)。 我以这种方式配置 Ignite Configuration

        var cfg = new IgniteConfiguration
        {
            JvmDllPath = @"C:\Program Files\Java\jdk-11.0.1\bin\server\jvm.dll",
            IsActiveOnStart = true,
            ClientMode = false,
            IgniteInstanceName = FirstValues.IgniteInstanceName,
            WorkDirectory = @"C:\IGNITE_HOME\workspace",
            GridName = Guid.NewGuid().ToString(),
            DataStorageConfiguration = new DataStorageConfiguration()
            {
                DefaultDataRegionConfiguration = new DataRegionConfiguration()
                {
                    PersistenceEnabled = true,
                    Name = "inMemoryRegion",
                    CheckpointPageBufferSize = 1024,
                },
                WriteThrottlingEnabled = true
            },
            BinaryConfiguration = new BinaryConfiguration()
            {
                CompactFooter = true,
                KeepDeserialized = false
            }
        };

        cfg = FirstValues.cacheConfigAll(cfg);
        cfg = FirstValues.setupDiscoveryConfig(cfg);
        Environment.SetEnvironmentVariable("IGNITE_H2_DEBUG_CONSOLE", "true");
        var ignite = Ignition.TryGetIgnite() ?? Ignition.Start(cfg);
        ignite.SetActive(true);
        var s = ignite.GetCluster().ForServers().GetNodes();
        ignite.GetCluster().SetBaselineTopology(s);

这两个类是这样实现的

        public static IgniteConfiguration cacheConfigAll(IgniteConfiguration config)
    {
        CacheConfiguration cacheConfigVehicle = VehicleCacheCfgReader();

        CacheConfiguration cacheConfigDevice = DeviceCacheCfgReader();

        CacheConfiguration cacheConfigZone = ZoneCacheCfgReader();

        CacheConfiguration cacheConfigGeoPoint = GeoPointCacheCfgReader();

        List<CacheConfiguration> list = new List<CacheConfiguration>();
        list.Add(cacheConfigVehicle);
        list.Add(cacheConfigDevice);
        list.Add(cacheConfigZone);
        list.Add(cacheConfigGeoPoint);
        config.CacheConfiguration = list;
        return config;
    }

    public static IgniteConfiguration setupDiscoveryConfig(IgniteConfiguration config)
    {
        TcpDiscoverySpi spi = new TcpDiscoverySpi();
        var ipFinder = new TcpDiscoveryMulticastIpFinder();
        ((TcpDiscoveryMulticastIpFinder)ipFinder).MulticastGroup = "228.10.10.157";
        ipFinder.LocalAddress = "127.0.0.1";
        spi.IpFinder = ipFinder;
        config.DiscoverySpi = spi;
        return config;
    }

这是我的缓存存储之一(它们彼此相似)

        public static CacheConfiguration VehicleCacheCfgReader()
    {
        return new CacheConfiguration(FmsCacheName)
        {
            Name = VehicleCacheName,
            SqlSchema = "PUBLIC",
            Backups = 1,
            CacheMode = CacheMode.Partitioned,
            WriteSynchronizationMode = CacheWriteSynchronizationMode.FullSync,
            AtomicityMode = CacheAtomicityMode.Atomic,
            WriteBehindEnabled = true,
            CacheStoreFactory = new VehicleCacheStoreFactory(),
            ReadThrough = true,
            WriteThrough = true,
            KeepBinaryInStore = false,
            DataRegionName = "inMemoryRegion",                
            QueryEntities = new List<QueryEntity>()
            {
                new QueryEntity()
                {
                    TableName = VehicleCacheName,
                    KeyType = typeof(string),
                    KeyFieldName = "Id",
                    ValueType = typeof(Vehicle),
                    Fields = new List<QueryField>() {
                            new QueryField("Id", typeof(string)) { IsKeyField = true },
                            new QueryField("Name", typeof(string)),
                            new QueryField("ZoneId", typeof(string))
                    }
                }
            }
        };
    }

现在当我开始点燃时出现这个错误

class org.apache.ignite.IgniteException: An error occurred during cache configuration loading from file [file=C:\IGNITE_HOME\workspace\db\node00-f9d2cd52-ad3e-4304-92ce-92f6585cb0a6\cache-DeviceCache1212201883355PM\cache_data.dat]
at org.

apache.ignite.internal.util.IgniteUtils.convertException(IgniteUtils.java:1025)
    at org.apache.ignite.internal.processors.platform.PlatformAbstractBootstrap.start(PlatformAbstractBootstrap.java:48)
    at org.apache.ignite.internal.processors.platform.PlatformIgnition.start(PlatformIgnition.java:75)
Caused by: class org.apache.ignite.IgniteCheckedException: An error occurred during cache configuration loading from file [file=C:\IGNITE_HOME\workspace\db\node00-f9d2cd52-ad3e-4304-92ce-92f6585cb0a6\cache-DeviceCache1212201883355PM\cache_data.dat]
    at org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager.readCacheData(FilePageStoreManager.java:843)
    at org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager.readCacheConfigurations(FilePageStoreManager.java:785)
    at org.apache.ignite.internal.processors.cache.GridCacheProcessor.addCacheOnJoinFromConfig(GridCacheProcessor.java:888)
    at org.apache.ignite.internal.processors.cache.GridCacheProcessor.startCachesOnStart(GridCacheProcessor.java:753)
    at org.apache.ignite.internal.processors.cache.GridCacheProcessor.onReadyForRead(GridCacheProcessor.java:737)
    at org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.notifyMetastorageReadyForRead(GridCacheDatabaseSharedManager.java:396)
    at org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.readMetastore(GridCacheDatabaseSharedManager.java:662)
    at org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager.notifyMetaStorageSubscribersOnReadyForRead(GridCacheDatabaseSharedManager.java:4610)
    at org.apache.ignite.internal.IgniteKernal.start(IgniteKernal.java:1048)
    at org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance.start0(IgnitionEx.java:2038)
    at org.apache.ignite.internal.IgnitionEx$IgniteNamedInstance.start(IgnitionEx.java:1730)
    at org.apache.ignite.internal.IgnitionEx.start0(IgnitionEx.java:1158)
    at org.apache.ignite.internal.IgnitionEx.start(IgnitionEx.java:656)
    at org.apache.ignite.internal.processors.platform.PlatformAbstractBootstrap.start(PlatformAbstractBootstrap.java:43)
    ... 1 more
Caused by: class org.apache.ignite.IgniteCheckedException: Failed to deserialize object with given class loader: jdk.internal.loader.ClassLoaders$AppClassLoader@14514713
    at org.apache.ignite.marshaller.jdk.JdkMarshaller.unmarshal0(JdkMarshaller.java:147)
    at org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:94)
    at org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager.readCacheData(FilePageStoreManager.java:839)
    ... 14 more
Caused by: java.lang.IllegalArgumentException: Ignite instance name thread local must be set or this method should be accessed under org.apache.ignite.thread.IgniteThread
    at org.apache.ignite.internal.IgnitionEx.localIgnite(IgnitionEx.java:1411)
    at org.apache.ignite.internal.binary.GridBinaryMarshaller.threadLocalContext(GridBinaryMarshaller.java:398)
    at org.apache.ignite.internal.binary.BinaryObjectImpl.readExternal(BinaryObjectImpl.java:695)
    at java.base/java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:2136)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2085)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
    at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
    at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
    at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
    at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
    at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
    at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
    at org.apache.ignite.marshaller.jdk.JdkMarshaller.unmarshal0(JdkMarshaller.java:139)

看来我之前的猜测是错误的。

有一个问题 IGNITE-10451,恐怕这意味着您在使用 Ignite.Net 时将无法同时使用 Cache Store 和 Persistence。

如果您删除所有缓存上的 CacheStore 定义并删除工作目录,它将正常启动。

经过一番搜索,我决定自己实现缓存存储机制。 如您所见,在 Ignite 架构中,当缓存中没有数据时,我们应该访问存储数据库,因此我在 get 函数中编写了一些代码来读取数据,并在其缓存中没有请求数据时将它们写入缓存。