问题标签 [second-level-cache]
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.
hibernate - 根实体及其集合的不同缓存并发策略(Hibernate with EHCache)?
给出来自Hibernate 文档的示例并对其进行修改,以便根级实体(客户)是只读的,而其集合(票证)之一是读写的:
从缓存访问客户时,票证集合会被刷新吗?
nhibernate - NHibernate 在二级缓存中找不到命名查询结果集
我有一个简单的单元测试,我使用相同的参数执行相同的 NHibernate 命名查询 2 次(每次不同的会话)。这是一个简单的 int 参数,由于我的查询是命名查询,我假设这两个调用是相同的,结果应该被缓存。
事实上,我可以在我的日志中看到结果正在被缓存,但使用不同的键。所以,我的第二个查询结果永远不会在缓存中找到。
这是我日志中的一个片段(注意键的不同):
(第一次查询)
调试 NHibernate.Caches.SysCache2.SysCacheRegion [(null)] <(null)> - 添加新数据:key= [snipped]... 参数:['809']; 命名参数:{}@ 743460424 & value=System.Collections.Generic.List`1[System.Object]
(第二个查询)
DEBUG NHibernate.Caches.SysCache2.SysCacheRegion [(null)] <(null)> - 添加新数据:key=[snipped]... 参数:['809']; 命名参数:{}@ 704749285 & value=System.Collections.Generic.List`1[System.Object]
我已将 NHibernate 设置为使用查询缓存。我将这些查询设置为 cacheable=true。不知道还能去哪里看。有人有什么建议吗?
谢谢
-迈克
java - 多个 java 应用程序的休眠数据库完整性
我们有 2 个 Java Web 应用程序都是读/写和 3 个独立的 Java 读/写应用程序(一个通过电子邮件加载问题,一个处理 xml 提要,一个向订阅者发送电子邮件)都使用休眠并共享一个公共代码库。
我们最近遇到的问题是,通过电子邮件加载的问题有时会覆盖在其中一个 Web 应用程序中创建的问题。请注意,这些是单独的问题,应该有单独的 ID。我们最初认为这是一个缓存问题。我们已经尝试关闭二级缓存,但这并没有什么不同。
问题:
顺便说一句,我们正在使用 MySQL。
我们没有明确地打开和关闭会话,而是让 hibernate 通过Util.getSessionFactory().getCurrentSession()
.
在这个阶段,我们宁愿不设置集群的二级缓存,因为这会造成另一层复杂性,而且我们对从应用程序整体获得的性能水平非常满意。
那么在 Web 应用程序中实现开放会话模式并在独立应用程序中手动管理会话听起来会解决这个问题吗?
或者还有其他建议/想法吗?
java - 什么是休眠中的二级缓存?
什么是休眠中的二级缓存?
java - 如何从二级查询缓存中获取条目?
在我的grails应用程序中,我想显示来自所有区域的二级缓存的所有当前条目。
我的代码如下:
但是,只要区域名称不是 org.hibernate.cache.StandardQueryCache
(用于Query Cache的区域),一切都可以正常工作。在这种情况下,会引发异常:
谷歌搜索后,我没有找到任何关于如何显示与区域StandardQueryCache
和UpdateTimestampsCache
.
您能帮我找到解决方案吗?
hibernate - Hibernate 二级缓存 - 什么时候可以从二级缓存中返回陈旧的集合成员?
我和我的一位同事一直在争论何时(如果?)缓存在二级缓存中的集合可以返回陈旧数据(我们使用的是 ehcache 和 hibernate 3.2.4 )。
这是场景:
- 父对象 P 被缓存并且是一个实体。
- 父母有一个缓存和懒惰的孩子的集合(袋子)。
- 子对象 C 被缓存并且是实体。
- 我们使用非严格读写作为我们所有这些的缓存并发策略。
- 我们的会话工厂是进程范围的,只涉及 1 个 JVM。
- 假设上述所有缓存的缓存区域足够大,可以轻松地将所有子项和父项的所有实例保存在内存中。
在时间 T1:通过执行 session.load(p) 并迭代子集合来加载父 P 和子 C1...CN,以便加载所有 C1...CN。
在时间 T2:另一个会话加载 C1 并更新 C1 更改其一些数据。
在什么情况下我可以调用 P.getChildren().get(0) 并且会返回 C1 的旧版本(在 T1 时间加载的 C1 版本)?
我想有两个:
- 如果我与 T1 中的操作处于同一休眠会话中(在这种情况下,将返回会话缓存版本)
- 使用非严格读写,可能会出现竞争条件,其中 T2 的更新和加载几乎同时发生,并且加载赢得了竞争并从缓存中检索过时的对象。(在这种情况下,我可以改为读写,我会没事的)
java - 如果数据库已经提供缓存,为什么还要使用应用程序级缓存?
现代数据库提供缓存支持。大多数 ORM 框架也会缓存检索到的数据。为什么这种复制是必要的?
java - 数据库模式中的休眠二级缓存和 ON DELETE CASCADE
我们的 Java 应用程序有大约 100 个类映射到数据库(SQL Server 或 MySQL)。我们使用 Hibernate 作为我们的 ORM(带有 XML 映射文件)。
我们在数据库模式中指定FOREIGN KEY
约束。我们的大多数FOREIGN KEY
约束还指定ON DELETE CASCADE
.
我们最近开始启用 Hibernate 二级缓存(用于流行的实体和集合)来缓解一些性能问题。
自从我们启用二级缓存后,性能得到了提升。然而,我们也开始遇到 ObjectNotFoundExceptions。
似乎 ObjectNotFoundExceptions 正在发生,因为数据库正在删除Hibernate下的表行。例如,当我们Parent
用 Hibernate 删除一个时,数据库模式将ON DELETE CASCADE
指向任何Child
实体。这显然是在没有 Hibernates 知识的情况下发生的,因此它没有机会更新二级缓存(并删除任何已删除的Child
实体)。
我们相信解决这个问题的方法是ON DELETE CASCADE
从我们的数据库模式中删除(但保留FOREIGN KEY
s)。相反,我们需要配置 Hibernate 以Child
使用普通删除 SQL 删除依赖项,这也将使 Hibernate 更新 2 级缓存。一些有限的测试表明这种方法似乎有效。
我想获得一些社区对此的反馈。我们的问题有替代(更好的?)解决方案吗?其他人如何处理这种情况?ON DELETE CASCADE
一般来说,在带有 Hibernate 的数据库模式中使用时应该考虑哪些权衡?
谢谢。
java - 具有大量并发事务的休眠二级缓存 ObjectNotFoundException
我们有一个使用 MySQL、Hibernate (3.5.1-Final) 和 EHcache(1.2.3) 作为二级缓存的 Java 应用程序。
我们的 hibernate.properties 隔离级别是 Read-committed isolation = 2
在大量并发事务下,我们看到某些集合(数据库关联)在加载时会引发 ObjectNotFoundException 的问题,并且似乎二级缓存正在返回该集合的旧副本。
我们有许多不同类型的事务可以访问这个集合(仅读取),并且只有几个可以从中添加/删除项目。
我们在单个事务负载甚至中等事务负载(10 - 20 个并发连接)下都看不到这个问题。
例如我们有一个 Character 实体:
通过从包含实体的集合中删除实体并调用 session.delete() 来删除实体时,我们正确地维护了对象图。
我们已经尝试更改 Set 项目;CacheConcurrencyStrategy 来自:
至
没有运气。
我们不使用数据库锁,而是使用乐观并发控制来捕获和重试冲突的事务。
在这一点上,我们唯一能看到的 2 个解决方案是:
尝试捕获ObjectNotFoundException并尝试智能地驱逐集合(尽管异常中似乎没有足够的上下文)
在 items 集合上使用@NotFound(action=NotFoundAction.IGNORE)注释,这将忽略并且不会抛出 ObjectNotFoundException (但我们担心它如何与二级缓存一起使用并确保它正在查看正确的数据) .
我希望有一个 @NotFound(action=NotFoundAction.EVICT_2ND_LEVEL_CACHE_RELOAD) 从缓存中驱逐该对象并尝试重新加载集合。
我们也可以尝试将 FetchyType 从 LAZY 更改为 EAGER,但我想尝试了解问题并选择最佳解决方案,以确保我们的事务中的数据在高并发下保持一致。