这种情况下如何创建缓存

08-10-30 lpc19598188
banq老师,
向您问好,
上大学的时候我就一直在看这个网站,
可惜后来ID丢失了,可惜!

我想向您请教一个缓存的问题:
我当前的web应用是采用struts + ibatis + spring的架构建立的,跑在websphere上,数据库是oracle10g. 

现在的应用在组合查询的页面反应非常慢, 这个页面会根用户输入的firstname, lastname, 电话号码,住址,国家,单位等十余种信息来进行查询.查询时这些输入框可以输入一个或多个,查询完成返回一组结果集.

因为firstname或者lastname的输入有太多种可能,比如输入ja的时候相当于做like 'ja%'的查询,输入jack的时候会做like 'jack%'的查询, 好像根据hashmap的键值对方式缓存查询条件和结果不太合适. (15长度的26个字母可以做26的15次方种查询条件组合)

我并不需要缓存整个web应用,只需要缓存这一块查询较慢的模块.
是不是有现成的合适的框架能解决我的问题啊?我对这些框架的缓存原理不是很了解.

我能否将整个数据库表作为一个对象存入application中,然后在web服务器中根据输入条件作遍历查询?我要查询的表的记录条数固定在70000左右,有60多列,查询只会用到其中的十几个列

您能给我指引下方向吗?

不胜感激!



lpc19598188
2008-10-31 09:00
哪位大哥有相关的经验也请不吝赐教啊,谢谢了

beckrabbit
2008-10-31 09:13
这个时候把这些要查询的信息放在内存数据库里比较好吧 想怎么查怎么查

lpc19598188
2008-10-31 09:22
因为我们数据库服务器和Web服务器离得比较远, 隔着大海, 为了节省网络传输的成本, 所以想要缓存在web服务器上

oracle上有可用的内存数据库技术吗?
您的意思是不是说把这个表keep在缓存中?

bloodrate
2008-10-31 09:22
我建议你先采用数据库级别的优化,比如给某列建立索引等等.你这种情况不适合建立缓存,你应该首先确认到底慢在数据库查询上面,还是慢在网络通信上面

lpc19598188
2008-10-31 09:32
数据库已经有dba小组做过优化了, 从httpwatch的报告看性能瓶颈不在数据库上.所以想要用缓存

最主要的原因是,我这个表每天只会批量更新一次,所以缓存是可以只读的
我有些自己做缓存的算法,但是不够成熟并且要改代码,有一定工作量,所以想寻求既有的可以解决此类问题的框架

二位有什么好的办法,可以给我讲讲啊

beckrabbit
2008-10-31 10:22
用h2db或者hsqldb做内存库,就一个jar文件,代码里控制库的启动停止,查询数据库的代码都不用改,就改一个数据库连接就行了。

lpc19598188
2008-10-31 10:46
嗯,确实是一个办法
我查下hsqldb的资料看看

lpc19598188
2008-10-31 10:59
我下到最新的hsqldb是1.8.0.10的
这个商用需要交钱吗?

lpc19598188
2008-10-31 15:16
自己手写了一个缓存, 把数据库读到一个有序ArrayList中了, 用另一hashmap做索引,对ArrayList作区段扫描, 31毫秒完成

算是搞定了

谢谢大家的指点