我想在我的hibernate项目中使用二级缓存,但我只知道一些关于hibernate二级缓存的问题,任何人都可以解释一下我在代码中使用这个问题以及我需要什么配置和.jar文件?我将这些设置设置为我的hibernate.cfg.xml文件
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
Run Code Online (Sandbox Code Playgroud)
并添加这些jar文件ehcache-1.6.1.jar, ehcache-1.6.1-javadoc.jar, ehcache-1.6.1-sources.jar
我想知道shoud我改变任何其他配置?
如何理解我的项目使用二级缓存?
如果只是把这个设置,hibernate自动使用这个,或者我必须在我的.java类中使用ant其他代码(比如任何注释或其他东西)
caching hibernate ehcache hibernate.cfg.xml second-level-cache
我使用@Cache批注在我的应用程序中定义了二级缓存
我正在使用findById查询,如下所示:
long id = 4;
Company cmp = companyDAO.findById(id);
Run Code Online (Sandbox Code Playgroud)
公司是我从DB获得的对象.
如何检查公司对象是来自数据库还是来自缓存?
我有一个任务是在我的项目中附加Oracle Coherence(它是缓存软件).使用它的一种方法是Level2 Hibernate缓存.我想看看hibernate何时从L2缓存中获取结果.我怎样才能做到这一点?两种方式都很好:如果可能的话,某种类型的监听器,或者直接访问Cache对象.提前致谢.
我想知道C#中是否存在允许访问CPU缓存的东西.这对我来说很有趣,但我目前没有与cpu缓存有关.所以我想知道它是否是一个系统受限访问,或者它也是用户可用的.我在谈论L1/L2或者他们叫什么!
很高兴听到你的评论,外部链接和一些代码片段!谢谢.
我已经看到它写了Hibernate二级缓存仅在调用load方法时使用.我无法找到关于它是否在调用时使用的任何结论性答案get,我们已经集成的GenericDAO项目主要使用.
是否在调用时使用了二级缓存org.hibernate.Session.get(Class clazz, Serializable id)?
我的情况是我更喜欢呆在像SQL Server这样的关系数据库存储系统中,因为我需要处理复杂的查询.
然后,因为一些计算会更好地加班,只是将结果存储到Redis或者更传统的NoSQL解决方案中.
这就是我想到的地方:NHibernate上的二级缓存发生了什么?.
我做了一个非常小的研究,我发现有一个Redis二级缓存提供商,现在我感到"困惑".
我的意思是,如果我使用NHibernate的二级缓存,大多数对象访问应该非常快,因为它应该没有数据库往返,因此大多数访问的对象将从内存中的Redis存储中检索.
为什么我要考虑这个而不是直接使用Redis?因为我需要在我的解决方案域中进行实际的原子事务处理.
是否依赖NHibernate的二级缓存Redis提供程序是一个好主意,以便获得最佳的关系和无模式世界?
你的建议是什么?
试图使用infinispan作为hibernate的二级缓存,但总是给我以下错误
org.infinispan.jmx.JmxDomainConflictException:ISPN000034:已经在'org.infinispan'JMX域下注册了JMX MBean实例type = CacheManager,name ="DefaultCacheManager".如果要允许在org.infinispan.jmx.CacheManagerJmxRegistration.updateDomain中的org.infinispan.jmx.JmxUtil.buildJmxDomain(JmxUtil.java:51)中的'globalJmxStatistics'配置元素中配置使用相同JMX域的多个实例启用'allowDuplicateDomains'属性(CacheManagerJmxRegistration.java:79)
这是hibernate属性
setProperty("hibernate.cache.use_second_level_cache", "true");
setProperty("hibernate.cache.use_query_cache", "true");
setProperty("hibernate.cache.region.factory_class",
"org.hibernate.cache.infinispan.InfinispanRegionFactory");
setProperty("hibernate.cache.infinispan.statistics", "false");
setProperty("hibernate.cache.infinispan.cfg", "infinispan-config.xml");
Run Code Online (Sandbox Code Playgroud)
infinispan配置文件
<?xml version="1.0" encoding="UTF-8"?>
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:infinispan:config:7.2"
xsi:schemaLocation="urn:infinispan:config:7.2
http://www.infinispan.org/schemas/infinispan-config-7.2.xsd
urn:infinispan:config:store:jdbc:7.2
http://www.infinispan.org/schemas/infinispan-cachestore-jpa-config-7.2.xsd">
<cache-container default-cache="default" statistics="false">
<local-cache name="simpleCache" statistics="false">
</local-cache>
</cache-container>
</infinispan>
Run Code Online (Sandbox Code Playgroud)
我有两个项目有两个数据源,一个用于审计,另一个是主要的Web项目.并且infinispan版本7.2中不存在异常中的xml值,提前感谢任何帮助:)
我正在使用NHibernate 3.0 配置二级缓存.二级缓存适用于实体和集合,但我也有一些已过滤集合的实体.
<bag name="EntityTrans" cascade="all-delete-orphan" table="EntityTrans">
<key column="entityId" not-null="true" />
<one-to-many class="MyDomain.EntityTran, MyDomain" />
<filter name="cultureFilter" condition=":cultureCode = CultureCode" />
</bag>
Run Code Online (Sandbox Code Playgroud)
NHibernate二级缓存不会缓存上面过滤的集合.我可以在NHProf中看到过滤的集合查询被发送到数据库.我的NHibernate配置文件包含以下条目.
<class-cache class="MyDomain.EntityTran, MuDomain" region="MyRegion" usage="read-only"/>
<collection-cache collection="MyDomain.Entity.EntityTrans" region="MyRegion" usage="read-only"/>
Run Code Online (Sandbox Code Playgroud)
我是否需要添加更多内容来缓存已过滤的集合?
我已经开始使用Hibernate 4和二级缓存.根据文档,配置非常简单:
<property name="hibernate.cache.use_second_level_cache" value="true"></property>
<property name="hibernate.cache.use_query_cache" value="true"></property>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"></property>
Run Code Online (Sandbox Code Playgroud)
根据我的理解,二级缓存应该消除对数据库的相同查询.我有非常简单的实体和非常简单的命名查询:
@Entity
@NamedQueries({
@NamedQuery(name="SimplePerson.findByName", query="select p from SimplePerson p where p.name = :name"),
})
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class SimplePerson {
public static final String FIND_BY_NAME = "SimplePerson.findByName";
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
public SimplePerson() {
}
public SimplePerson(String name) {
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
我运行命名查询4次,不幸的是我看到hibernate运行了4次.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
EntityManager em = emf.createEntityManager();
Query query = em.createNamedQuery(SimplePerson.FIND_BY_NAME);
query.setParameter("name", "BOB");
List result = …Run Code Online (Sandbox Code Playgroud) 我想澄清一些有关休眠的二级缓存的要点。需要澄清的一点是,HQL查询是否总是会命中数据库(至少是为了获取ID)。
考虑我们有实体
class Customer {
long id; // Primary key
String name;
set <Address> addressList; // One to many relationship
}
class Address{
long id; // Primary key
String houseName;
}
Run Code Online (Sandbox Code Playgroud)
地址的数据库表具有对客户(id)的外键引用,以支持一对多关系。
前提是,我已将2级缓存启用为EHcache休眠。仅实体和关联设置为可缓存。没有启用查询缓存。
我知道,如果我多次使用session.get()或session.load(),则只有第一个调用才会向数据库发出查询,而随后的调用将从2级缓存中获取数据。
我的问题是
1)HQL是否会利用二级缓存。在一个会话中,我执行了一个HQL以使用主键(id)获取对象,“从Customer c,其中c.id =?”)。setParameter(1,1005)。
如果我在不同的会话中运行了相同的HQL,则将从2级缓存中获取Customer对象,否则它将再次访问数据库。
2)考虑执行另一个HQL,from Customer as c left join fetch c.addressList以选择客户和关联的地址。
如果我在不同的会话中运行了相同的HQL,则将从第二级缓存中获取关联的地址,否则它将再次命中数据库。