问题标签 [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.caches.syscache 3.1
我一直在浏览互联网,似乎找不到可以下载适用于 NHibernate 3.1.0.4000 的 v3.1 的 nhibernate.caches.syscache 的地方。
我有 syscache 的 3.0.0.4000 版本,但有更新的版本吗?
fluent-nhibernate - 多用户环境中的 NHibernate QueryCache
对于我们的 Web 应用程序 (ASP.NET),我们使用 Fluent NHibernate (2.1.2) 和二级缓存,不仅用于实体,还用于查询(使用标准 API 生成查询)。我们使用 Session-Per-Request 模式和一个 SessionFactory 应用程序,因此缓存服务于所有 Nhibernate-Sessions。
问题:
我们必须在遗留数据库 (Oracle) 中的数据对象上为每个用户处理不同的“访问权限”——也就是说,视图限制了每个用户权限的返回数据。所以有这样的情况,例如,我们的条件使用完全相同的查询查询相同的视图,但返回不同的结果集,具体取决于用户权限。
现在,为了获得性能,提到的查询被缓存。但这给我们带来了问题,当用户 A 的操作首次触发查询时,它会缓存结果 ID,即用户 A 有权访问的 ID。不久之后,用户 B 的操作触发了相同的查询,然后 Nhibernate 从第一次调用(来自用户 A)中选择缓存的 ID,并尝试获取用户 B 没有访问权限的相应实体(或者可能不适合所有人)。我们正在使用事件侦听器检查权限,因此我们的应用程序在上述情况下会引发访问权限异常。
想法:
不缓存查询可能是针对此的一种选择。但是性能在我们的应用程序中显然是一个问题,因此非常希望缓存用户的查询。
我们甚至考虑过每个用户都有一个 SessionFactory,每个用户都有一个缓存,有点。但这显然对资源有影响,有点矫枉过正,老实说不是一个选择,因为有实体,必须由多个用户(想想一个用户组)访问和操作,创建“个人缓存”中的陈旧数据等问题。所以这是不行的。
什么是有效的解决方案?对于这种情况,是否有“最佳实践”之类的东西?
主意:
因为我昨天被困在这个问题上,看不到出路,所以我睡在上面,今天我想出了某种“黑客”。
由于 NHibernate 通过查询文本和参数(“子句”)缓存查询,我想到了一种方法,在查询的签名中“走私”与用户相关的东西,因此它会缓存每个用户的每个查询,但不会更改查询本身(关于查询结果)。
所以“创造力”引导我这样做(示例代码):
这一行:
.Add(Expression.Sql(string.Format("{0} = {0}", userName)))
导致 where 子句,它总是评估为 true,但从 Nhibernate 的角度“更改”查询,因此它缓存每个单独的“用户名”。
我知道,这有点难看,我对此并不满意。 有人知道任何替代方法吗?
提前致谢。
c# - 索引超出了数组的范围 - NHibernate 3.2
我一直在尝试将使用 fluent nhibernate 1.2 和 NHibernate 3.1 的项目升级到 FNH 1.3 和 NH 3.2,这一切似乎都有效,除了现在我在 .List() 命令上遇到异常。
异常类型和消息是... NHibernate.Exceptions.GenericADOException 无法执行 find[SQL: SQL not available] 和内部异常... System.IndexOutOfRangeException 索引超出了数组的范围。
我已经在 SQL Server 中分析了查询,我认为这是 AppFabric 缓存和 NH 3.2 的问题,因为 NH 生成的查询很好。
代码中的任何内容都没有改变我的 FNH 和 NH 引用。
以下是我在 C# 中的查询...
以下是FNH生成的映射hbm,版本之间没有变化...
在 NH 3.2 源代码中,以下行是引发异常的地方...
和调用堆栈...
因此,任何帮助将不胜感激,如果您想了解更多信息,请告诉我,谢谢。
nhibernate - NHibernate 二级缓存 - 驱逐区域
我们在 nHibernate 实现中设置了许多缓存区域。为了避免负载平衡的 Web 服务器出现问题,我想有效地禁用编辑缓存数据的页面上的缓存。我可以编写一个方法来轻松清除所有查询缓存、类缓存和实体缓存。
但我真正想要的是按区域清除缓存。sessionFactory.EvictQueries() 将采用区域参数,但 Evict() 和 EvictCollection() 没有。我真的不想在这里丢弃整个缓存,也不想维护某种笨拙的字典,将类型与其缓存区域相关联。nHibernate 是否有办法询问实体或集合的缓存设置是什么?
谢谢
nhibernate - NHibernate Cache PrevalenceProvider 奇怪的行为
我多年来一直在快乐地使用 NH Prevalence Cache 提供程序,但最近,我的团队开始陷入一些我还无法解释的数据错误......
我们通过设置缓存提供程序并将流行度基础文件夹设置为 AppDomain.CurrentDomain.BaseDirectory 设置默认过期时间 120 来设置流行度
映射中的每个缓存注册都有一个区域名称
缓存似乎工作,但如果应用程序被回收,NHibernate 将返回的数据与有效标识符不正确,它提供的数据似乎由另一个实体拥有。如果我们删除文件夹 (AppDomain.CurrentDomain.BaseDirectory) 中的 .snapshot 文件,那么一切都开始正常工作,直到下一次回收出现问题。
有人遇到同样的问题吗?任何人都可以帮助解决这个问题?
当然,我忘记或忽略了某些东西,但是可以更好地解释如何设置流行度的人将不胜感激 在此先感谢
nhibernate - 如何在 NHibernate >= 3.2 中配置 NHibernate 的二级缓存?
在升级到 NHibernate 3.2 之前,我为 Fluent NHibernate 使用了以下代码:
但是,.Cache()
在 NHibernate 3.2 中不再找到扩展方法。
我将如何设置我的缓存提供程序?
编辑:我也试过:
hibernate - Hibernate HQL createQuery
我正在尝试以旧方式转换执行 SQL 查询的旧应用程序,如下所示:
上面的代码大约需要 10 毫秒。这包括获取数据库连接、创建语句和执行查询。
我现在使用 Hibenate HQL 并创建了一个这样的 HQL 查询:
现在只是这个语句“session.createQuery(....)”大约需要 105 毫秒,这大约是上面提到的以旧方式执行整个查询的 10 倍。
现在我不太确定 Hibernate 查询缓存是如何工作的,但如果我再次运行同样的 HQL 语句,大约需要 5 毫秒。
现在我的问题是为什么使用 Hibernate HQL 会发生这种行为?任何人都知道“session.createQuery(...)”方法内部发生了什么,第一次需要更长的时间,但第二次运行的时间要少得多?我还注意到,Hibernate 在执行“query.list()”时两次都对数据库执行 SQL。
谢谢。
ehcache - 使用 terracotta 设置休眠分布式 ehcache 时的会话工厂问题
我正在尝试使用 Terracotta 在分布式环境中设置 EHCache。在这里,我可以连接应用程序服务器和 Terracotta 服务器,在 terracotta Developer Console 中,我可以看到复制的对象。
但是在应用程序服务器中不断出现以下异常消息,尽管应用程序的其余部分运行正常:
大家好,如果有任何机构可以指导为什么会出现此异常消息以及我们如何解决它。此外,如果有任何关于为休眠应用程序设置兵马俑的综合教程,这对我也会有所帮助。
这里 [CacheByAmitNode8081] 是我在应用服务器中定义的缓存节点的名称。
java - 如何在 JPA 中使用 Hibernate 的二级缓存?
我正在实现基于实体属性值的持久性机制。所有数据库访问都是通过 Hibernate 完成的。我有一个包含节点路径的表,它非常简单,只有一个 id 和一个路径(字符串)路径数量很少,大约几千。
主表有数百万行,我没有重复路径,而是将路径标准化为他们自己的表。以下是插入主表时我想要的行为
1)检查路径表中是否存在路径(通过实体管理器查询,使用路径值作为参数)
2)如果不存在,插入,获取id(通过实体管理器持久化)
3)将id作为外键值放入主表行,并将其插入主表。
对于一组域对象,这将发生数千次,它们对应于主表和其他一些表中的许多行。因此,使用单个事务重复上述步骤,如下所示:
当我执行第 2 步时,它会给整个操作带来巨大的性能下降。它正在乞求缓存,因为一段时间后,该表将最多有 10-20k 个条目,其中包含非常罕见的新插入。我试过用 Hibernate 来做这件事,结果丢了将近 2 天。
我正在使用带有 JPA 注释和 ECache 的 Hibernate 4.1。我尝试启用查询缓存,即使在整个插入过程中使用相同的查询对象,如下所示:
NodePath 实体注释如下:
从统计数据中可以看出,查询缓存正在被使用,但没有报告二级缓存的使用:
一个简单的手写哈希表作为缓存,按预期工作,大大减少了总时间。我想由于我的操作性质,我无法触发 Hibernate 的缓存。
如何在此设置中使用 hibernate 的二级缓存?作为记录,这是我的持久性 xml:
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
hibernate - Hibernate 4.1.x EhCache 不在磁盘上存储任何内容
我正在使用Hibernate 4.1.1.Final和Spring MVC 3.1.x并同时使用第一级和第二级缓存。我使用注释为缓存操作配置了我的域对象。但是缓存不会在磁盘上存储任何内容。
这是我的 ehcache.xml 文件:
休眠缓存属性:
域对象的基于 Annonation 的配置:
/tmp 文件夹中没有名为 **ehcache的文件夹:**