您的位置:首页 > 数据库 > Memcache

memcached分布式缓存和hibernate结合-- Hibernate+ehcache二级缓存技术

2013-10-15 18:26 357 查看
Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached 的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。

memcached的使用

Memcached服务器端的安装 (此处将其作为系统服务安装)

下载文件:memcached 1.2.1 for Win32 binaries (Dec 23,
2006)

1 解压缩文件到c:\memcached

2 命令行输入 'c:\memcached\memcached.exe -d install'

3 命令行输入 'c:\memcached\memcached.exe -d start' ,该命令启动 Memcached ,默认监听端口为 11211

通过 memcached.exe -h 可以查看其帮助

问题

  如果没有下载服务器端(如果memcached的使用)开启memcached服务的话,那么将出现一系列的错误,最主要是报连接的问题。所以大家在使用memcached的时候一定要安装服务器端。

memcached和Hibernate的结合

现在Hibernate实现了memcached的无缝连接,已经说过了,hibernate暴力的地方是他的缓存,hibernate结合memcached也是相当方便,只需配置,启动服务器没有错误算配置OK啦。去在网上看了一大堆关于hibernate和memcached结合的文章,文章内容基本上都是一致的,郁闷死,参考价值就少了很多。本人公司正使用memcached作为Hibernate的二级缓存,在这里也整理一下相关的内容。

  hibernate的缓存机制是其成为主流持久层霸主地位的重要组成部分,他的缓存机制是很黄很暴力的。二级缓存是SessionFactory级别的全局缓存,可以通过配置文件的hibernate.cache.provider_class 进行指定。在上次的日志上有提到相关的配置,在这里我再次贴一次供需要的人了解。

hibernate.cfg.xml

代码

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory name="default">

<property name="hibernate.show_sql">true</property>

<property name="hibernate.format_sql">true</property>

<property name="hibernate.hbm2ddl.auto">update</property>

<!-- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> -->

<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

<property name="hibernate.jdbc.fetch_size">50</property>

<property name="hibernate.jdbc.batch_size">0</property>

<property name="hibernate.default_schema">user</property>



<!-- hibernate-memcache配置-->

<!-- 开启二级缓存-->

<property name="hibernate.cache.use_second_level_cache">

true

</property>

<!-- 设置缓存类-->

<property name="hibernate.cache.provider_class">com.googlecode.hibernate.memcached.MemcachedCacheProvider</property>

<!-- 设置memcache缓存服务器端口 -->

<property name="hibernate.memcached.servers">localhost:11211</property>

<!-- 设置二级缓存的前缀名称 -->

<property name="hibernate.cache.region_prefix">quality.cache.ehcache</property>

<!-- 否使用结构化的方式缓存对象 -->

<property name="hibernate.cache.use_structured_entries">true</property>

<!-- 是否缓存查询结果 -->

<property name="hibernate.cache.use_query_cache">true</property>



<mapping resource="com/weiruan/projs/mydc/pojos/Usert.hbm.xml"/>

<mapping resource="com/weiruan/projs/mydc/pojos/Developer.hbm.xml"/>

</session-factory>

</hibernate-configuration>

依赖的包:hibernate-memcache.jar,memcached-2.3.1.jar、spy2.4、slf4j-1.5.0.jar、slf4j-log4j12-1.5.0.jar还有一个hibernate-memcached[版本].jar,下载地址:http://code.google.com/p/hibernate-memcached/downloads/list

1、首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下:

<?xml version="1.0" encoding="UTF-8"?>

<ehcache>

 <diskStore path="java.io.tmpdir"/>

  <defaultCache

   maxElementsInMemory="10000" <!-- 缓存最大数目 -->

   eternal="false" <!-- 缓存是否持久 -->

   overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时-->

   timeToIdleSeconds="300" <!-- 当缓存闲置n秒后销毁 -->

   timeToLiveSeconds="180" <!-- 当缓存存活n秒后销毁-->

   diskPersistent="false"

   diskExpiryThreadIntervalSeconds= "120"/>

</ehcache>

2、在Hibernate配置文件中设置:

<!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -->

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

 <!-- 是否使用查询缓存 -->

 <property name="hibernate.cache.use_query_cache">true</property>

  如果使用spring调用Hibernate的sessionFactory的话,这样设置:

  <!--HibernateSession工厂管理 -->

   <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

   <property name="dataSource">

    <ref bean="datasource" />

   </property>

   <property name="hibernateProperties">

   <props>

    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>

    <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>

    <prop key="hibernate.show_sql">true</prop>

    <prop key="hibernate.cache.use_query_cache">true</prop>

    <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>

   </props>

 </property>

 <property name="mappingDirectoryLocations">

  <list>

   <value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>

  </list>

 </property>

</bean>

说明一下:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置

hibernate.cache.use_query_cache true 才行

3、在Hbm文件中添加<cache usage="read-only"/>

4、如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性

5、实践出真知,给一段测试程序,如果成功的话第二次查询时不会读取数据库

package cn.rmic.hibernatesample;

import java.util.List;

import org.hibernate.CacheMode;

import org.hibernate.Criteria;

import org.hibernate.Query;

import org.hibernate.Session;

import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory;

import cn.rmic.manager.po.Resources;

public class testCacheSelectList ...{

 /** *//**

 * @param args

 */

 public static void main(String[] args) ...{

  // TODO Auto-generated method stub

  Session s=HibernateSessionFactory.getSession();

  Criteria c=s.createCriteria(Resources.class);

  c.setCacheable(true);

  List l=c.list();

  // Query q=s.createQuery("From Resources r")

  // .setCacheable(true)

  // .setCacheRegion("frontpages") ;

  // List l=q.list();

  Resources resources=(Resources)l.get(0);

  System.out.println("-1-"+resources.getName());

  HibernateSessionFactory.closeSession();

  try ...{

   Thread.sleep(5000);

  } catch (InterruptedException e) ...{

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

  s=HibernateSessionFactory.getSession();

  c=s.createCriteria(Resources.class);

  c.setCacheable(true);

  l=c.list();

  // q=s.createQuery("From Resources r").setCacheable(true)

  // .setCacheRegion("frontpages");

  // l=q.list();

  resources=(Resources)l.get(0);

  System.out.println("-2-"+resources.getName());

  HibernateSessionFactory.closeSession();

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: