mamcached与Hibernate、Spring集成,以及junit单元测试

      最近在弄mamcached与Hibernate以及spring集成,在网上找了很多相关资料结果发现都是复制粘贴的,结果一直集成失败。mamcached的安装与启动大家应该都会了吧。现在重点介绍集成。

      与spring集成的正确配置是这样的。

   <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool"  
        factory-method="getInstance" init-method="initialize"  
        destroy-method="shutDown">  
         <constructor-arg>  
            <value>memCachedPool</value>  
        </constructor-arg>  
        <property name="servers">  
            <list>  
                <value>127.0.0.1:11211</value>  
                <value>127.0.0.1:11220</value>  
            </list>  
        </property>  
          
        <property name="initConn">  
            <value>20</value>  
        </property>  
          
        <property name="minConn">  
            <value>10</value>  
        </property>  
 
        <property name="maxConn">  
            <value>50</value>  
        </property>  
 
        <property name="maintSleep">  
            <value>3000</value>  
        </property>  
 
        <property name="nagle">  
            <value>false</value>  
        </property>  
 
        <property name="socketTO">  
            <value>3000</value>  
        </property>  
    </bean>  
 
    <bean id="memCachedClient" class="com.danga.MemCached.MemCachedClient">  
          <!--多个服务器时必须指定poolName-->
          <constructor-arg>  
            <value>memCachedPool</value>  
        </constructor-arg>
    </bean> 

  

----------------------------------------------------------------

      其实本文主要重点还是与Hibernate的集成,让MemCached作为Hibernate的二级缓存。googlecode对Hibernate的MemCached支持jar包与最新的MemCachedClient   for java不匹配,因为最新的MemCachedClient   for java中有一个方法已经过时,googlecode的集成jar包com.googlecode.hibernate.memcached.dangamemcached.DangaMemcacheClientFactory.class还在调用过时的方法

 /** @deprecated */
  public void setCompressEnable(boolean paramBoolean)
  {
    throw new UnsupportedOperationException();
  }

调用这个方法就直接抛出异常了。

使用老版本的MemCachedClient   for java也是可以的,但是最终我还是选择了com.googlecode.hibernate.memcached.spymemcached.SpyMemcacheClientFactory.class

使用这个spy的集成需要下载几个固定的jar包,spy-2.4.jar,memcached-2.1.jar,hibernate-memcached-1.2.2.jar必须用这三个版本的jar包。其他jar包单独与spring集成倒不会出现问题,与Hibernate的集成会出现各种方法签名问题。网上对于Hibernate集成的配置倒是对的,所以就不介绍了。

配置好了之后,肯定要测试是否有效啊。

先使用MemCachedClient   for java的接口获取所有的key

public void testGetAll() {
        List<String> list = new ArrayList<String>();  
        Map<String, Map<String, String>> items = memCachedClient.statsItems();  
        for (Iterator<String> itemIt = items.keySet().iterator(); itemIt.hasNext();) {  
            String itemKey = itemIt.next();  
            Map<String, String> maps = items.get(itemKey);  
            for (Iterator<String> mapsIt = maps.keySet().iterator(); mapsIt.hasNext();) {  
                String mapsKey = mapsIt.next();  
                   String mapsValue = maps.get(mapsKey);  
                   if (mapsKey.endsWith("number")) {  //memcached key 类型  item_str:integer:number_str  
                    String[] arr = mapsKey.split(":");  
                       int slabNumber = Integer.valueOf(arr[1].trim());  
                       int limit = Integer.valueOf(mapsValue.trim());  
                       Map<String, Map<String, String>> dumpMaps = memCachedClient.statsCacheDump(slabNumber, limit);  
                       for (Iterator<String> dumpIt = dumpMaps.keySet().iterator(); dumpIt.hasNext();) {  
                           String dumpKey = dumpIt.next();  
                           Map<String, String> allMap = dumpMaps.get(dumpKey);  
                           for (Iterator<String> allIt = allMap.keySet().iterator(); allIt.hasNext();) {  
                               String allKey = allIt.next();  
                               list.add(allKey.trim());  
      
                           }  
                       }  
                   }  
            }  
        }  
        System.out.println(list.size());
    }

再使用net.spy.memcached.MemcachedClient的接口

@Test
    public void testGet() throws IOException {
           /* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */

        MemcachedClient mc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));

        /* 按照key值从memcached中查找缓存,不存在则返回null */

        Object b = mc.get("key");

        System.out.println(b);

        mc.shutdown();
    }

建议使用debug模式去查看object的hashtable属性。

总之事实证明集成还是比较成功的。

---------------------------------------------------------------------------------------------------------------------------

private static ApplicationContext applicationContext;
    private static MemCachedClient memCachedClient;
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        applicationContext=new ClassPathXmlApplicationContext("spring/memcachedclient.bean.xml");
        memCachedClient=(MemCachedClient) applicationContext.getBean("memCachedClient");
    }

    @Test
    public void testGet() {
        Object object=memCachedClient.get("a");
        System.out.println(object);
    }
    @Test
    public void testAdd() {
        for(int i=0;i<1000;i++){
            memCachedClient.add("a"+i,new Date());
        }
    }
    @Test
    public void testSet() {
        Boolean result=memCachedClient.set("a","testSet");
        System.out.println(result);
    }
    @Test
    public void testReplace() {
        Boolean result=memCachedClient.replace("a","testReplace");
        System.out.println(result);
    }
    @Test
    public void testDelete() {
        Boolean result=memCachedClient.delete("a");
        System.out.println(result);
    }
    @Test
    public void testGetAll() {
        List<String> list = new ArrayList<String>();  
        Map<String, Map<String, String>> items = memCachedClient.statsItems();  
        for (Iterator<String> itemIt = items.keySet().iterator(); itemIt.hasNext();) {  
            String itemKey = itemIt.next();  
            Map<String, String> maps = items.get(itemKey);  
            for (Iterator<String> mapsIt = maps.keySet().iterator(); mapsIt.hasNext();) {  
                String mapsKey = mapsIt.next();  
                   String mapsValue = maps.get(mapsKey);  
                   if (mapsKey.endsWith("number")) {  //memcached key 类型  item_str:integer:number_str  
                    String[] arr = mapsKey.split(":");  
                       int slabNumber = Integer.valueOf(arr[1].trim());  
                       int limit = Integer.valueOf(mapsValue.trim());  
                       Map<String, Map<String, String>> dumpMaps = memCachedClient.statsCacheDump(slabNumber, limit);  
                       for (Iterator<String> dumpIt = dumpMaps.keySet().iterator(); dumpIt.hasNext();) {  
                           String dumpKey = dumpIt.next();  
                           Map<String, String> allMap = dumpMaps.get(dumpKey);  
                           for (Iterator<String> allIt = allMap.keySet().iterator(); allIt.hasNext();) {  
                               String allKey = allIt.next();  
                               list.add(allKey.trim());  
      
                           }  
                       }  
                   }  
            }  
        }  
        System.out.println(list.size());
    }




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值