我将实体添加到我的数据库,它工作正常.但是当我检索List时,我得到了旧实体,我添加的新实体在我取消部署应用程序并再次重新部署之前不会显示.这意味着我的实体默认是缓存的吗?但是,我没有在persistence.xml或任何此类文件中对缓存实体进行任何设置.
我甚至尝试过调用flush(),refresh()和merge().但它仍然只显示旧实体.我错过了什么吗?请帮我.
我找到了一些如何配置纯hibernate以使用EHCache的说明.但我找不到任何说明如何配置JPA2.0 EntityManager来使用缓存.Hibernate 3.5.2是我的JPA2.0提供程序.
编辑// @Cacheable(true)对于实体来说足够了吗?或者我应该使用@org.hibernate.annotations.Cache配置实体?
我们有一个使用nhibernate和二级缓存的网站.我们正在讨论一个人想要关闭二级缓存,因为我们正在转向多个Web服务器环境(前面有一个负载均衡器).
一个论点是摆脱二级缓存并专注于优化和调整Db.另一个参数是将分布式缓存作为二级缓存推出.
我很想听听人们在这里对数据库调优与分布式缓存(在涉及的工作量,成本,复杂性等方面的因素)的关系.
sql-server nhibernate asp.net-mvc distributed-caching second-level-cache
我正在试图找出应该为我的应用程序使用哪种缓存并发策略(特别是实体更新).该应用程序是使用Hibernate开发的Web服务,部署在Amazon EC2集群上并在Tomcat上运行,因此没有应用程序服务器.
我知道,有非严格读写\读写和事务的可更新并且有成熟的,流行的,生产就绪2L缓存提供Hibernate数据缓存并发策略:Infinispan的,的Ehcache,Hazelcast.
但我并不完全理解Hibernate文档中的事务和读写缓存之间的区别.我认为事务缓存是集群应用程序的唯一选择,但现在(在阅读了一些主题之后),我对此并不那么确定.
所以我的问题是关于读写缓存.它是集群安全的吗?它是否保证数据库和缓存之间的数据同步以及所有连接的服务器之间的同步?或者它只适用于单服务器应用程序,我应该总是喜欢事务缓存?
例如,如果正在更新实体字段(名字等)的数据库事务失败并已回滚,那么读写缓存是否会丢弃更改,或者只是填充错误数据(更新后的名字)到所有其他节点?这需要JTA交易吗?
JBoss TreeCache的并发策略配置作为第二级Hibernate缓存主题说:
'READ_WRITE`是一个有趣的组合.在这种模式下,Hibernate本身就是一个轻量级的XA协调器,所以它不需要一个完整的外部XA.它的工作原理简短说明:
- 在这种模式下,Hibernate管理事务本身.所有数据库操作必须在事务内,自动提交模式将不起作用.
- 在flush()期间(可能在事务生存期内多次出现,但通常在提交之前发生)Hibernate会通过一个会话并搜索更新/插入/删除的对象.然后,这些对象首先保存到数据库,然后在高速缓存中锁定和更新,因此并发事务既不能更新也不能读取它们.
- 如果事务随后被回滚(显式或由于某些错误),则锁定的对象被简单地释放并从缓存中逐出,因此其他事务可以读取/更新它们.
- 如果事务成功提交,则只需释放锁定的对象,其他线程可以读/写它们.
是否有一些文档如何在集群环境中工作?
似乎事务高速缓存正常工作,但需要JTA环境与独立事务管理器(如JBossTM,Atomikos,Bitronix),XA数据源以及大量配置更改和测试.我设法部署了这个,但我的框架仍然存在一些问题.例如,Google Guice IoC不支持JTA事务,我必须用Spring替换它或将服务移动到某个应用程序服务器并使用EJB.
那么哪种方式更好?
提前致谢!
我有一个Hibernate域对象,由应用程序的不同部分加载.有时延迟加载每个关联和其他关联是有利的,最好在一个连接中加载整个事物.作为一个充满希望的妥协,我发现:
使用批量提取,如果访问一个代理,Hibernate可以加载几个未初始化的代理.批量提取是延迟选择提取策略的优化.
hibernate.default_batch_fetch_size:
使用批量提取,如果访问一个代理,Hibernate可以加载几个未初始化的代理.批量提取是延迟选择提取策略的优化.
我也看到:
hibernate.jdbc.fetch_size:
非零值确定JDBC获取大小(调用Statement.setFetchSize()).
Hibernate是否足够聪明,可以在进行批量提取时查看二级缓存?即,一次获取初始调用关联,然后下一个X调用命中缓存?这样我就可以拥有我想要的延迟加载,但也经常点击缓存以获得更大量的交易.
如果集合的整个内容已经包含在缓存中,它是否仍然会在访问集合时执行获取查询?
谢谢.
该NHibernate的文档和书籍的NHibernate在行动状态高速缓存提供商NHibernate.Cache.HashtableCacheProvider不能用于生产用途.但是,我找不到理由.有谁知道原因?
目前,为了检查Hibernate二级缓存是否用于数据库查询,我检查我的SQL日志(通过datasource.groovy中的p6spy或logSql = true)来查看Grais/Hibernate是否触发了SQL查询.我假设如果未记录查询,则可能意味着使用了缓存.
对于简单的信息来说这很复杂,不是吗?
那么您是否知道获取和记录信息的简单方法:"使用缓存与触发数据库查询"?
编辑:遵循Pascal建议,我已将此添加trace 'org.hibernate.cache'到我的log4j配置中.
我使用NHibernate和Memcached作为二级缓存,并且一直对cache.use_minimal_puts配置选项感到好奇.
根据文件:
hibernate.cache.use_minimal_puts:优化二级缓存操作以最小化写入,但代价是更频繁的读取.此设置对于群集缓存最有用,并且在Hibernate3中,默认情况下为群集缓存实现启用.
为了清楚起见,我没有在集群环境中运行Memcached,但它确实在远程计算机上运行.另一个需要考虑的因素可能是读取和写入Memcached之间的速度是否存在任何重大差异.
cache.use_minimal_puts在这种情况下,我能从中受益吗?
我刚刚意识到org.hibernate.cache.internal.NoCacheProviderHibernate 4 Core包中没有类.也许它被弃用了.那么Hibernate 4有什么交替的吗?先感谢您!
与此问题相关
前提:
这些是我的假设,根据我的阅读,经验和理解,他们可能是错的,如果他们是,请评论,我会编辑问题.
题:
我有一个不在二级缓存中的对象.由于一些糟糕的编程或其他约束,加载对象的代码在同一个休眠会话中被多次调用.回顾是使用HQL查找查询,例如
hibernateTemplate.find("from Foo f where f.bar > ?", bar);
Run Code Online (Sandbox Code Playgroud)
在添加查询缓存之前,如果上述代码在同一个Hibernate会话中被调用了N次,那么数据库就会有N次命中
然后我想看看如果添加查询缓存会发生什么:
Query query = session.createQuery("from Foo f where f.bar > ?");
query.setCacheable(true);
query.setParameter(bar);
query.list();
Run Code Online (Sandbox Code Playgroud)
当我添加查询缓存时,我注意到在同一个会话期间,hibernate不会再次访问数据库N次,每个会话只有一次.
Foo不在第二级缓存中的object()在数据库中被更改,那么查询缓存(跨会话范围)将返回错误的标识符,从而返回错误的对象.那是对的吗?顺便说一下,在相关问题中声称查询缓存不适用于会话缓存范围.我想知道这个说法或其他什么吗?
hibernate ×6
nhibernate ×3
caching ×2
java ×2
orm ×2
asp.net-mvc ×1
ehcache ×1
grails ×1
hibernate3 ×1
jpa ×1
jpa-2.0 ×1
logging ×1
memcached ×1
query-cache ×1
sql-server ×1