发表于: 2017-02-14 23:51:23
1 1783
今天完成的事情:
SpringMVC-Mybatis中整合Memcached框架
明天计划的事情:
加上Memcache,在新建数据的时候同时维护好缓存(没有新建数据接口就自己加上,可以分成是压测JSP和Json接口两种方式) ,确定数据没问题,重新压测服务器,测出90%的线在哪里.
遇到的问题:
1、在pom.xml文件中引用com.danga.java-memcached包不能识别
这是因为java memcached client没有官方的maven repository可供使用,因此使用时需要手动将其安装到本地repository。给Maven项目导入第三方jar包的办法:
命令模板是:mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
之后报错:
网上搜了一下这个是因为2.6.6版本的java memcached client要依赖slf4j-simple、slf4j-api、commons-pool三个包这里缺少commons-pool的jar包,在pom.xml添加:
但是,问题依然没有解决:
最后,找到的原因让人无语,memcache的properties配置文件中,:
这段代码我是直接在网上粘贴过来的,server参数后面加了一句注释,问题就出在这句注解上了,这段代码在memcache-content.xml文件中引入时,把这句注释也引入了,造成无法识别,也不报错,解决方案就是把这句注释去除。
2、今天专门测试了引用com.danga:memcached和com.whalin:memcached这两个包,我一开始也是为了图方便引用了com.whalin这个包,但是不能操作成功,
用单元测试:
但每次得到的都是null
后来改用com.danga之后,操作成功,然后我再次改回com.whalin后还是不行,配置应该是没错的,因为同样的配置用com.danga就可以,用com.whalin就得不到,不明白。
3、memcached配置文件
这段构造方法不能省略。缺少这代也得不到数据。
4、spring.xml文件中加上引入memcache配置的文件后,tomcat启动时,Spring容器报错
其实,这是Spring框架配置多个propertyConfigurer的问题,解决方案在收获中有详细说明
收获:
1,关于Spring框架配置多个propertyConfigurer的问题,一般我们在spring引用配置文件如jdbc.properties、memcache.properties时,有两种方式引入:
1)第一种用<context:property-placeholder/>
而<context:property-placeholder/>这个基于命名空间的配置,其实内部就是创建一个PropertyPlaceholderConfigurer Bean而已。换句话说,即Spring容器仅允许最多定义一个PropertyPlaceholderConfigurer(或<context:property-placeholder/>),其余的会被Spring忽略掉
2)第二种就是直接用PropertyPlaceholderConfigurer类
而造成这个问题的原因,如果A和B模块是单独运行的,由于Spring容器都只有一个PropertyPlaceholderConfigurer,因此属性文件会被正常加载并替换掉。如果A和B两模块集成后运行,Spring容器中就有两个PropertyPlaceholderConfigurer Bean了,这时就看谁先谁后了, 先的保留,后的忽略!因此,只加载到了一个属性文件,因而造成无法正确进行属性替换的问题。
解决方案:把properties文件全部在一个PropertyPlaceholderConfigurer加载
在各个分配置中,不再配置PropertyPlaceholderConfigurer了
网上还有另外一种配置的方法,在各个分配置中分别配置:
spring-mybatis.xml文件中:
memcached-content.xml文件中:
当然也可以用<context:property-placeholder/>
这种分别配置的需要注意几点:
1) spring运行时如果发现这个bean实现了Ordered,则按照顺序执行;默认无序;
2) 加order属性,则会反应出顺序,值越小优先级越高即越早执行,先扫描order='1' 的,如果没有扫描order='2'的
3) 默认情况下ignore-unresolvable;即如果没找到的情况是否抛出异常。默认false:即抛出异常,所以要指定顺序,且只有最后一个ignore-unresolvable=false;
评论