日期:2014-05-20  浏览次数:21295 次

请教超级高手,要怎么样把一张表中的100百万条记录的20万条记录,放到内存里
可能题目有点不明确,。。我这样说好了:

由于我的程序要大量访问数据库中的记录的,如果要读一条记录的话就要访问一次数据库,(数据库已使用了连接池)。

所以如果我把一部分记录(20万条)放到内存里的话就可以大大减少读数据库中记录的次数,它在内存里找到有的话就直接从内存里取了,而不用再访问数据库。

当然如果在程序里又能加以判断那些记录是经常要访问的,那些是很少访问的,然后就把那很少访问的记录自动删除掉的话,性能又更不错了。

请问一下大家,这个用java要怎么实现,要使用那些类、那些方法比较好,先谢谢了!!

数据库表users中的字段只有(id,name,password,membercode,status)。


下面这图是刚刚画的操作数据库图,希望大家能看懂、、、


------解决方案--------------------
你的想法是对的,可以先将一部分数据放到内存中,以减少数据库的访问,但是20万条都放到内存里就不太好了,一是加载的时候慢,二是占用的内存也比较多。
可以少放一些。可以放到数组中。

天狼工作室
http://www.j2soft.cn
------解决方案--------------------
一个典型的 cache 应用吧,具体的不清楚,当然用 map, 或者数组也是可以的,但如何来判断经常,可能是个头痛的问题吧
------解决方案--------------------
我的简单解决方案是: 
针对记录表,写一个对应的类。它的一条记录,对应一个对象。 
这个类要重写hasCode方法,使得返回name的hasCode值。 
写一个Cache类,扩展LinkedHashMap,重写removeEldestEntry方法。 
Cache类里面的Key存放name,Value存放对象本身。 
在构造器中,调用超类的构造方法时,选择三个参数的构造器,并且,第三个参数accessOrder要设置成true。 
然后,
Java code

protected boolean removeEldestEntry(Entry eldest) {
  if(size()<=cacheSize)return false;//cacheSize设置成20万
  return true;
}

------解决方案--------------------
关注一下
------解决方案--------------------
看看hibernate的源码,它里面有个缓存机制,你看看是不是你要的
------解决方案--------------------
直接用OSCache来做。你可以搜索一下看看关于它的介绍
------解决方案--------------------
某些数据库直接内置了这种方式,也就是说,数据库系统自己把部分数据读到内存里,然后你查询的时候,表面上还是从数据库里查询,但是实际上,数据库系统是从内存中读出这部分数据的(当然,内存里没有的还是要去数据库里读)。我记得Oracle支持这种方式。
------解决方案--------------------
探讨
你的想法是对的,可以先将一部分数据放到内存中,以减少数据库的访问,但是20万条都放到内存里就不太好了,一是加载的时候慢,二是占用的内存也比较多。
可以少放一些。可以放到数组中。

天狼工作室
http://www.j2soft.cn

------解决方案--------------------
算一下.. 就算1条数据按最大的 1k算的话..

1000条才1M . 
10000条10M
1000000条1G.
当然..几个字段肯定没有1K ..看来还是很可行的.. 但就是 全读到内存里面很费时间..
------解决方案--------------------
关注一下
------解决方案--------------------
在IBATIS里可以这样写
<cacheModel id="categoryCache" type="LRU">
<flushOnExecute statement="insert"/>
<flushOnExecute statement="update"/>
<flushOnExecute statement="delete"/>
<property name="reference-type" value="WEAK"/>
</cacheModel>
<select
id="getCategory" parameterClass="Category"
resultClass="Category" cacheModel="categoryCache">
SELECT *
FROM Category
WHERE categoryId=#categoryId#
</select>
type
MEMORY This model simply stores the cached data in memory
until the garbage collector removes it.
FIFO This is a fixed size model that uses a “first in, first out”
algorithm to remove items from memory.
LRU This is another fixed-size model that uses a “least
recently used” algorithm to remove items from memory.
OSCACHE This model uses the OpenSymphony (or OS) cache.

在Hibernate里也应该有相应的配置,不过没有深入研究过。

建议不要自己写,除非你的技术非常过硬,因为当你自己写时,要考虑的东西很多,最重要的就是数据的准备性,处理不好返尔事得其返。

------解决方案--------------------