我有一个使用WCF创建的数据服务,内部使用nHibernate.此WCF数据服务由使用Tcp Channel部署在Web Server上的Asp.Net应用程序使用.
为了提高nHibernate数据服务的性能,我想实现nHibernate二级缓存.哪个二级缓存提供商在这个场景中会很好?由于SysCache使用Asp.net缓存,我可能无法在WCF服务中使用它?
上述WCF数据服务可以在不同服务器上具有多个实例,以提高应用程序的可伸缩性.
有没有人使用AppFabric进行二级缓存?
我知道这是遵循同样的API为速度(nhibernate.caches.velocity),但想知道是否有人已经有了使用它的一些生产经验,如果他们知道任何特别的技巧或问题的?
我正在尝试决定是否从Hibernate全身使用转为使用JPA2.0,从而提供便携式设备.
1. JPA2.0支持自定义用户类型吗?
2.我正处于实现Terracotta二级缓存的边缘,Hibernate主要考虑其聚类能力.我想,但我实际上并不知道,这JPA2.0也定义了二级缓存提供程序的规范.如果我是对的,是否Terracotta实施了它?(如果有人能指出我的入门Terracotta,JPA我会很感激).
感谢提前,
Ittai
我是hibernate和spring的新手,我尝试使用hibernate二级缓存.但它似乎不起作用.我有一个以下测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
@TransactionConfiguration
@Transactional
public class CacheTest extends AbstractTransactionalJUnit4SpringContextTests
{
@Test
public void testCache1()
{
System.out.println("Running testCache1");
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
MutableDAO<AppUser> appUserDAO = new MutableDAOImpl<AppUser>(AppUser.class, (SessionFactory) ctx.getBean("OnMediaSessionFactory"), 10);
assertNotNull("AppUser DAO is null.", appUserDAO);
SessionFactory sessionFactory = (SessionFactory)ctx.getBean("OnMediaSessionFactory");
long numberOfUsers = appUserDAO.countAll();
System.out.println("Number of rows :" + numberOfUsers);
final String cacheRegion = AppUser.class.getCanonicalName();
SecondLevelCacheStatistics settingsStatistics = sessionFactory.getStatistics().
getSecondLevelCacheStatistics(cacheRegion);
StopWatch stopWatch = new StopWatch();
stopWatch.start();
appUserDAO.findAll();
stopWatch.stop();
System.out.println("Query time : " + stopWatch.getTotalTimeSeconds());
System.out.println(settingsStatistics);
} …Run Code Online (Sandbox Code Playgroud) 有没有人尝试过对Azure AppFabric Cache使用NHibernate Velocity L2缓存提供程序?如果是这样,你发现了什么?
另外,我们使用SQL Azure来存储我们的数据.
nhibernate azure second-level-cache azure-appfabric azure-sql-database
我想将属性占位符放在ehcache.xml文件中(如$ {}),以便可以在运行时从外部属性文件(.properties)替换值.就像是:
ehcache.xml(在类路径中):
Run Code Online (Sandbox Code Playgroud)<defaultCache maxElementsInMemory="20000" eternal="false" timeToIdleSeconds="${default_TTI}" timeToLiveSeconds="86400" overflowToDisk="true" ... />
ehcache.properties(在war/classpath之外):
Run Code Online (Sandbox Code Playgroud)... default_TTI=21600 ...
目的是能够更改缓存配置,而无需重建应用程序.Spring的PropertyPlaceHolder只适用于我不想要的ehcache的Spring bean definiton(需要将ehcache.xml保存为文件)
这里有类似的帖子,但没有任何东西让我解决.我一直在寻找一个星期!!
我使用Spring 2.5.6,Hibernate 3.2.6和Ehcache 2.4.6
任何帮助或想法是非常Appriciated !!
非常感谢,Tripti.
我有两个实体 Book 和 Author。本书有作者的集合。我使用二级缓存来保存 Book 实体及其作者。调试时,我可以看到putForExternalReadBook 实例和集合中的每个作者都在发生。但是当我find(Book.class, ISBN)再次调用方法时,它只为书使用缓存,而每次从数据库中检索作者的集合。每次作者集合都放在二级缓存中。请让我知道是否需要更改缓存访问策略以进行收集。我正在使用 Jboss 6.0 Infinispan 5. 和 postgres 9 DBMS。
这是我的代码
package bookentity.ejb;
Run Code Online (Sandbox Code Playgroud)
/* * 要更改此模板,请选择工具 | 模板 * 并在编辑器中打开模板。*/
import java.io.Serializable;
import java.util.ArrayList;
import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.ManyToMany;
import javax.persistence.JoinTable;
//import javax.persistence.JoinColumns;
import javax.persistence.JoinColumn;
import java.util.Collection;
import java.util.List;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
//import javax.persistence.inv
import javax.persistence.OneToMany;
@Entity
@Cacheable
@Table(name = "BOOK")
@NamedQueries({@NamedQuery(name="findBookByAuthorName",query="SELECT b FROM Book b, Author a …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何使用nhibernate缓存一个连接的查询,它似乎不正常工作
这是我的代码:
public CacheTestViewModel GetCacheTestViewModel()
{
var vm = new CacheTestViewModel();
var session = Repository.Session;
using (var tx = session.BeginTransaction())
{
vm.Projects = Repository.Session.Query<Project>()
.FetchMany(r=>r.ProjectApplications)
.ThenFetch(r=>r.Application)
.Cacheable().CacheMode(CacheMode.Normal)
.ToList();
tx.Commit();
}
return vm;
}
Run Code Online (Sandbox Code Playgroud)
我一遍又一遍地运行它似乎是从二级缓存加载Project对象但它仍然返回到db来查询ProjectApplication对象,这很慢
是否有可能nhibernate缓存整个查询,以便从缓存中返回整个图形?
注意:我确实打开了查询缓存以及使用Cache.ReadWrite()设置的所有实体
这是我的缓存配置
return configuration
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<ApplicationMap>().Conventions.Add(typeof(Conventions)))
.ExposeConfiguration(
c => {
// c.SetProperty("proxyfactory.factory_class", proxyFactory);
c.SetProperty("cache.provider_class", "NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache");
c.SetProperty("cache.use_second_level_cache", "true");
c.SetProperty("cache.use_query_cache", "true");
c.SetProperty("expiration", "86400");
})
.BuildSessionFactory();
Run Code Online (Sandbox Code Playgroud) 我们使用EhCache的2级高速缓存(4.3.8.Final中)Hibernate(4.3.8.Final)用于查询(仅在主要读取表),实体之间的实体与集合。
所以你可以说二级缓存被大量用于优化目的。
到目前为止,我们从未遇到过任何大问题......
我们关于相关实体的持久性模型基本上如下所示:
首先,我们有 2 个实体,它们在自然父子关系中具有双向映射:
@Entity
@Table(...)
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Parent extends BaseEntity {
@Id
private long id;
@OneToMany(mappedBy="parent", fetch=FetchType.LAZY, cascade = CascadeType.REMOVE)
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
private Set<Child> children;
// getters and setters
}
@Entity
@Table(...)
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Child extends BaseEntity {
@Id
private long id;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "parent_id", nullable = false)
private Parent parent;
// getters and setters …Run Code Online (Sandbox Code Playgroud)我正在尝试将Infinispan配置为hibernate二级缓存.一切都很好,但我想调整默认配置,即所有缓存共享的值.
缓存是用于注明实体自动创建的@Cache,我可以通过一个在对其进行自定义一个infinispan.xml通过<distributed-cache-configuratoin>.但是,我希望所有这些缓存都有默认值(例如驱逐策略).
另一件事是,我想将所有这些生成的缓存标记为"分布式"(默认情况下它们是"本地").
这是我的一个例外infinispan.xml:
<cache-container default-cache="default" statistics="true">
<transport stack="external-file" />
<!-- Configuring specifics for the User entity. How to do it globally? -->
<distributed-cache-configuration name="user" statistics="true" />
</cache-container>
Run Code Online (Sandbox Code Playgroud)
我该怎么做这些事情?
hibernate ×6
java ×4
nhibernate ×4
ehcache ×2
infinispan ×2
jpa ×2
spring ×2
.net ×1
appfabric ×1
azure ×1
caching ×1
collections ×1
jpa-2.0 ×1
terracotta ×1
wcf ×1