首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

hibernate Search 持续研究 增加 hibernate memcache 二级缓存 配置成功 附件maven代码(2)

2012-07-04 
hibernate Search 继续研究 增加 hibernate memcache 二级缓存 配置成功附件maven代码(2)首先安装 memecac

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包的.

热点排行