持久性实施 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 函数中编写了一些代码来读取数据,并在其缓存中没有请求数据时将它们写入缓存。
我是 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 函数中编写了一些代码来读取数据,并在其缓存中没有请求数据时将它们写入缓存。