问题标签 [nhibernate-caches]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
nhibernate - 具有二级缓存的 NHibernate 未重新水化属性标记为 insert="false" update="false"?
在 Nhibernate 中实现二级缓存时遇到问题。我有一个类映射如下:
属性“ClientID”是 Clients 表的外键,Client 多对一属性使用它来查找关联的客户端对象。
当我添加一个新帐户时,我使用 Session.Get 从数据库中查找 Client 对象并将其分配给我的 Account 对象的 Client 属性。在后台,当对象被写入数据库时,这也会自动填充 ClientID 属性,并且 ID 正确存储在数据库中。当我使用 Session.Get 按 ID 从数据库中检索 Account 对象时,检索对象时所有字段都正确填充。
但是,当我使用上面显示的设置实现二级缓存时,使用 Session.Get 检索 Account 对象时不会填充 ClientID 属性,但会正确填充 Client 属性。是否有某些原因为什么这不适用于二级缓存?还是我在映射/配置中做错了什么?
现在我只是使用 SysCache 作为我的缓存提供程序,并且查询和二级缓存都打开了。Client 类映射包含 Accounts 对应的一对多属性。
我喜欢在我的 Account 类上拥有 ClientID 属性的便利性,这样我就可以在不使用 Client 属性的情况下读取它,而且它似乎在没有缓存的情况下也能正常工作。
谢谢你的帮助。
富有的
c# - 使用动态更新或插入时,如何使 NHibernate 被视为属性始终是脏的?
我正在寻求有关 NHibernate 问题的帮助,该问题已经困扰我一段时间了。长话短说:
我正在寻找一种方法,在每次我进行更新或插入时,在一级缓存中“重置”实体上的属性。
我想要实现的是,在使用动态更新或插入时,NHibernate 总是认为有问题的属性是脏的。
这背后的故事是,我知道,如果事务成功,我想要“重置”的列将在数据库中通过触发器设置为 Null。另一方面,一级缓存不知道这一点,因此 NHibernate 会认为当我将其设置为与之前更新/插入相同的值时,该属性未更新。问题是我的触发器取决于设置的这个值。造成的混乱是,如果我想使用动态更新或插入,我只能更新/插入一个实体,而无需事后“刷新”它(我真的不想这样做)。
提示或帮助将不胜感激,因为我在这里真的碰壁了
nhibernate - 流畅的休眠一级缓存未按预期工作
我有一个在一个会话中被多次调用的函数。根据我对 NHibernate 一级缓存的理解,无论调用次数如何,同一会话中的精确查询只会执行一次。
但事实并非如此。下面是代码片段,我可以看到在 NHProfiler 中执行的查询与调用该函数的次数一样多。
我在这里理解 NHibernate 是否遗漏了什么?
谢谢
nhibernate - 如果模型是会话失败事务的一部分,NHibernate 将不允许我在会话中插入模型
为什么在第一次尝试插入模型时从数据库返回错误后我不能只插入模型:
但是当我更新现有模型时,我得到一个错误,我可以进行修复(在这种情况下设置一个名称)并尝试再次更新:
nhibernate - NHibernate - 使用集合缓存时重复结果
当使用具有多层双向父子(-grandchild)一对多关系的二级缓存时,我从 NHibernate 得到非常奇怪的行为:
第二个孩子,有两个孙子,在集合中被复制,但具有相同的对象 id ( ReferenceEquals()
is true
)。当我禁用Parent.Children
集合的缓存或将获取策略设置为 时Join
,问题就消失了。任何想法如何找出这里发生的事情?
实体:
映射:
[编辑]
我通过不为子集合启用缓存来解决这个问题。因为我首先这样做是为了避免fetch join
对缓存实体的子项进行查询时出现 N+1 选择问题,所以我改为执行以下操作:
不过,我仍然不明白这里发生了什么,所以仍然欢迎对此事有任何见解:-)。
nhibernate - NHibernate MemCached w/ Protobuf-net.Enyim -- does it actually work?
I've used the following assemblies to hook up NHibernate 2nd-level caching with Enyim Memcached using Protobuf-net binary serializer:
- NHibernate
- NHibernate.Caches.EnyimMemcached
- Enyim.Caching
- protobuf-net
- protobuf-net.Enyim
It's recently come to my attention that despite hooking up protobuf-net with EnyimMemcached, I'm likely not actually using that serializer as all my entities were marked with just [Serializable]
and neither [DataContract]
or [ProtoContract]
with corresponding ordered Data/ProtoMembers for the properties. I can get protobuf-net to work with EnyimMemcached when I interact with the memcache directly after I add the appropriate attributes (or register them manually with the RuntimeTypeModel.Default class of protobuf-net).
However, even if I do the due-diligence with registering my types with protobuf-net, I don't think any cache entry coming from NHibernate will actually be serialized by protobuf-net because NHibernate.Caches.EnyimMemcached stores entries in the cache within DictionaryEntry
objects:
DictionaryEntry
does not have [DataContract]
and [DataMember(Order = xx)]
attributes. This makes me wonder...
Can I even properly utilize the protobuf-net serializer for NHibernate 2nd level caching?
.net - 如果缓存群集失败,AppFabric NHibernate 提供程序不会将请求转发到数据库
我已经分配了使用NHibernate AppFabric 缓存提供程序(由Simon Taylor编写)为二级缓存设置AppFabric的任务。我已经成功设置并且它正在工作。但是在失败的情况下,如果缓存集群或整个服务停止工作(假设我只有 1 个缓存服务器),应用程序请求不会转发到数据库。当我重新启动集群时,应用程序按预期工作。
因此,尽管只有 1 个缓存服务器实际上并不正确,但在这种故障情况下,我应该怎么做才能让我的应用程序使用 DB?
任何建议将不胜感激。
nhibernate - NHibernate.Caches.AppFabric nuget 包无法与 Azure AppFabric 缓存服务建立连接
用于将 Azure AppFabric 缓存服务用作 NHibernate 的二级缓存的 NHibernate.Caches.Appfabric nuget 包在 Azure SDK 的 V 1.8 中运行良好。
但是,在升级到 VS 2012 和 Azure SDK 2.0 版后,nuget 包已停止工作,并且 AppFabric DLL 无法与 Azure AppFabric 缓存服务建立连接。连接到 Azure AppFabric 缓存服务时出现以下错误:
在 Microsoft.ApplicationServer.Caching.DataCacheFactory.EstablishConnection(IEnumerable 1 servers, RequestBody request, Func
3 sendMessageDelegate, DataCacheReadyRetryPolicy retryPolicy) 在 Microsoft.ApplicationServer.Caching.DataCacheFactory.ThrowException(ErrStatus errStatus, Guid trackingId, Exception responseException, Byte[][] payload, EndpointID destination) 在 Microsoft .ApplicationServer.Caching.SocketClientProtocol.Initialize(IEnumerable 1 servers)
at Microsoft.ApplicationServer.Caching.DataCacheFactory.GetCache(String cacheName, CreateNewCacheDelegate cacheCreationDelegate, DataCacheInitializationViaCopyDelegate initializeDelegate)
at NHibernate.Caches.AppFabric.AppFabricCacheFactory.GetCache(String cacheName, Boolean useDefault)
at NHibernate.Caches.AppFabric.Adapters.AppFabricCacheNamedAdapter.GetCache(IAppFabricCacheFactory cacheFactory)
at NHibernate.Caches.AppFabric.AppFabricCacheAdapter..ctor(String regionName)
at NHibernate.Caches.AppFabric.Adapters.AppFabricCacheNamedAdapter..ctor(String regionName)
at NHibernate.Caches.AppFabric.AppFabricCacheAdapterFactory.Create(String regionName)
at NHibernate.Caches.AppFabric.AppFabricProvider.BuildCache(String regionName, IDictionary
2 properties) at NHibernate.Cache.CacheFactory.CreateCache(String usage, String name, Boolean mutable, Settings settings, IDictionary`2 properties) at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg、IMapping 映射、Settings 设置、EventListeners 监听器)
==================================================== ===
你能建议如何解决这个问题吗?
谢谢
nhibernate - NHibernate 二级缓存性能
在研究 nhibernate 中二级缓存提供的可能性时,我测试了一些实现。目前结果出乎意料,我怀疑我的期望是否错误。
- 场景(重读)
首先将 4 * 20000 个具有一个字符串属性的简单对象插入数据库,然后四个线程通过对象 ID ( session.Get<SimpleObj>(id)
) 获取它们。每个线程只访问它创建的 ID。访问模式是随机的,获取 1000 个对象,然后重新创建会话。
结果
- Redis 每秒 5000 次读取
- MemCached 每秒 8000 次读取 (EnyimMemcached)
- 无缓存每秒 15000 次读取(同一台机器,TCP-IP)
- 无缓存每秒 25000 次读取(同一台机器,共享内存)
- SysCache2 每秒 200000 次读取
- HashtableCacheProvider 每秒 380000 次读取
使用的版本
- NHibernate 4.0.0.4000 和 https://github.com/nhibernate/NHibernate-Caches的当前版本
- 来自https://msopentech.com/opentech-projects/redis/的 Redis 服务器 3.0.501
- 来自 Couchbase ( http://www.couchbase.com/ )的 MemCached 1.4.5_4_gaa7839e
这些提供程序和 SysCache2 实现之间的不同性能是否可以预期?
更新 1
正如 Frederic 指出的那样,测试场景没有太大意义,因为比较了具有两种不同用例的两种不同类别的缓存架构。第一类(5 和 6)不能水平缩放,而 1 和 2 可以。目前 SQL-Server 在同一台机器上运行,因此使用共享内存作为 IPC 机制,因此我禁用了所有 IPC 连接可能性,并将其配置为使用 TCP/IP 连接到数据库。结果,no-cache-scenario 的性能下降了大约 10000 op/s,这使最快的分布式缓存提供程序进入了合理的距离。
通过比较缓存提供程序,我想测试这些提供程序是否可以在每个请求的会话设置中用于缓存参考数据,例如国家、货币或资产负债表结构。由于性能最好的分布式缓存的性能仍然只有普通 NHibernate 版本的 op/s 的一半,我不确定这是否是要走的路。
c# - 带有 AliasesToBean 转换器的 Nhibernate 2 级缓存
我有一个实体:
和相关的Dto:
我有一个非常简单的查询:
它一直在工作,直到我插入二级缓存。因此,如果我取消注释Cacheable()
行,我将得到异常:
消息:值不能为空。参数名称:别名 StackTrace:
那有什么问题呢?它是 NHibernate 的错误吗?我尝试了不同的提供商,但无济于事。我也尝试像这样创建 CacheableResultTransformer:
它可以返回和缓存数据,但只能作为元组(对象 [])。我没有设法返回 Dto。
这是演示问题的工作示例:github