hibernate Search 继续研究 增加 hibernate memcache 二级缓存 配置成功 附件maven代码(2)
首先安装 memecached 服务端:
?
之前写过的 文章,centos?安装memcached服务 :
?
http://toeo.iteye.com/blog/1240607
?
然后 在 前几天的 弄的 ?hibernate search 基础上,再添加 memcached 缓存。
?
因为 hibernate search 虽然 建立了索引。查询速度快了。。但是依然要 load 数据。
?
证据就是 可以看到搜索如果有结果 ?肯定会执行 hql 将数据一次都查询出来。
?
Hibernate: select this_.id as id0_0_, this_.city as city0_0_, this_.passwd as passwd0_0_, this_.user_name as user4_0_0_ from user_info this_ where (this_.id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?))
?
当然我觉得 也可以配置 成 直接 将 索引里面的数据 转换成 bean 返回。
?
但是 有个问题就是。一般是针对 文章进行索引。
?
要再继续 将文章的内容也添加到索引里面的话这样 ,索引文件会很大。重建索引会慢。(以后可以实验下)
?
?
对于文章来说。里面还会有很多 html 代码。放到 索引里面总觉得不太合适。。索引应该尽量小,才可以保证查询速度。
?
至于将文章放到 memcahed 里面好像也不太好。多了也会变大。但现在内存都是白菜价。很便宜。
?
所以考虑 还是 弄个 memecached 吧。
?
再有考虑到将来拆分 项目。弄个集群啥的。。memcached 方便的很。
?
要用到的开源项目:
?
http://code.google.com/p/hibernate-memcached/
?
hibernate memcached 版本 1.2.2
?
http://code.google.com/p/spymemcached/
?
因为?hibernate memcached 要用到这个项目 版本 2.7.3
?
添加pom 我也把 原文件 添加进来了。 。遇到问题的时候可以看看。
?
?
?
?
?
在pojo 里面添加标注:
?
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
?
这样就可以缓存数据了。
?
然后
?
安装 官方的配置文件:
?
http://code.google.com/p/hibernate-memcached/wiki/Configuration
?
?
如果启动报错:
?
?
??
?
连续查询多次。将数据全部查询出来:数据只有两条记录。需要查询多次才可以看出效果。
?
开启 hibernate 日志
?
?
java.lang.UnsupportedOperationExceptionat com.googlecode.hibernate.memcached.MemcachedCache.toMap(MemcachedCache.java:227)at org.hibernate.cache.impl.bridge.BaseRegionAdapter.contains(BaseRegionAdapter.java:62)at org.hibernate.impl.SessionFactoryImpl$CacheImpl.containsEntity(SessionFactoryImpl.java:982)at org.hibernate.impl.SessionFactoryImpl$CacheImpl.containsEntity(SessionFactoryImpl.java:977)at org.hibernate.search.query.hibernate.impl.SecondLevelCacheObjectsInitializer.initializeObjects(SecondLevelCacheObjectsInitializer.java:65)at org.hibernate.search.query.hibernate.impl.PersistenceContextObjectsInitializer.initializeObjects(PersistenceContextObjectsInitializer.java:81)at org.hibernate.search.query.hibernate.impl.QueryLoader.executeLoad(QueryLoader.java:84)at org.hibernate.search.query.hibernate.impl.AbstractLoader.load(AbstractLoader.java:72)at org.hibernate.search.query.hibernate.impl.FullTextQueryImpl.list(FullTextQueryImpl.java:208)at com.freewebsys.demo.service.impl.UserInfoServiceImpl.findUserInfoBySearchContent(UserInfoServiceImpl.java:83)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)at $Proxy22.findUserInfoBySearchContent(Unknown Source)at com.freewebsys.demo.hibernate_search.AppTest.testSearch(AppTest.java:94)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)at org.junit.runners.ParentRunner.run(ParentRunner.java:236)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)??
?
这个定义了 使用 hibernate search 查询的时候 的数据 全部 按照id 到数据库查询。
?
如果有没有缓存就 先 按照id 进行查询。然后set 到缓存。如果有直接去。
?
这个运行的非常清晰。
?
执行多次相同查询的时候。
?
第一次 执行 了 N 次数据库查询。以后就都没有数据查询了。
?
总结:
?
hibernate memcached 缓存配置成功。缓存的调用在第 1 次还是要查询数据的。
并且查询缓存对 是将 sql 和参数 转换成一个 hash 然后进行匹配的。
?
而在 hibernate search 中的使用 memcached 就是get 形式的查询了。要执行N次。
使用用query 的查询报错。
?
这样基本满足了对文章搜索的时候 使用缓存 查询的要求了。
?
?
在上线的时候 千万要修改下 ?memcached 的配置
?
?
/etc/sysconfig/memcached
?
?
ORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="1024"#设置下缓存大小。默认 64
OPTIONS=""
?
?
附件是工程代码。
?
1 楼 tianjie123 2012-06-04 你好,我把你的工程放入eclipse时,跑不起来,你能够提供下这个工程的有关hibernate,与spring的jar包列表吗? 2 楼 toeo 2012-06-04 tianjie123 写道你好,我把你的工程放入eclipse时,跑不起来,你能够提供下这个工程的有关hibernate,与spring的jar包列表吗?
这个hibernate的配置是自动生成表的.只要配置好数据库就行.
使用的是maven工程.maven会自动下载jar包的.