读书人

请问超级高手要如何样把一张表中的1

发布时间: 2012-02-02 23:57:14 作者: rapoo

请教超级高手,要怎么样把一张表中的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里也应该有相应的配置,不过没有深入研究过。

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

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


牛人很多啊...
[解决办法]
axman

老大,你msn怎么从来不上。真晕.........
[解决办法]

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

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

[解决办法]
使用开源的缓存框架就行了,种类很多想Oscache
应该比较适合你,
可以时候对象在缓存中的发呆时间,到了发呆时间就从缓存中删除掉了,也就是说缓存里面的数据都是活跃的。
大量的数据缓存框架会存储到磁盘上,这也比从数据库大量的筛选要快的多了。
[解决办法]
up
[解决办法]
临时表和内存表,全部加载算了,呵呵
[解决办法]
lz一下从数据库里面取20万放map里面这种设计真是。。。。。
看楼主代码应该初涉及java不久,希望不要走弯路。
我相信楼下会有人同意我的观点。
正如12楼所说,要考虑的东西很多,处理不好返尔事得其返。
2年多开发经验,没听说过这种设计。
[解决办法]
这样显然不能的HashMap有个默认加载因子,好像是可以自动扩容的,你用HashMap(int initialCapacity, float loadFactor)来构造看看,把loadFactor也就是加载因子设为0,看可不可以控制容量,我这网吧,不能试试.

不过如20楼所说,干啥要这样呢,要这样也别自己写,除非你已是牛牛B的人,不然用现成的东西好.

[解决办法]
赞同20楼那位兄弟的看法,以及火龙果的方案,
如果有现成的更好的,数据库缓存方案,那就立刻使用,
毕竟使用HashMap这种缓存方法,功能太过单一,使得以后对程序功能的添加造成过大的影响。

如果楼主决定使用我在3楼所提供的那个HashMap方案。
那么,请楼主仔细再阅读一下里面内容,理解我的目的。我在你的同名帖子里也有相关的恢复,请仔细看一下。
我在网吧,我法把其中代码写个例子给你。

现在,我再说明一下:针对你在19楼的回复,
1. HashMap<Integer,UserInfo> hashmap = new HashMap<Integer,UserInfo>(200000);
不要直接使用HashMap做为缓存,要自己写一个LinkedHashMap的扩展类
(我暂时将其命名为CacheMap,扩展类就是你在声明的时候 public class CacheMap extends LinkedHashMap),
因为LinkedHashMap类,可以实现按照访问顺序,将里面的元素进行排序。
这样,我们就可以实现,当缓存已经满20万的时候,如果在田加数据,那么同时会优先删除缓存内不经常访问的对象。
当然,实现这个功能,还要第二点的支持。
2.CacheMap类要重写removeEldestEntry方法,这个方法,在你向其对象添加新元素的时候被调用。
具体代码,我在3楼已经写了。
目的就是保证CacheMap的对象,里面所存储的键值对,不超过20万个。
3.既然要写个CacheMap类,那么,在构造器(构造函数)中的代码,记得要调用超类的构造方法,
并且调用超类的构造方法时,选择三个参数的构造器,并且,第三个参数accessOrder要设置成true
这样可以使的,其对象,在向里面添加键值对的时候,可以将键值对按照访问顺序排序。
4.我在3楼所说的重写hasCode方法,就不用重写了。
5。关于该方案缺点的几个声明
A.说白了CacheMap还是Map接口的一个实现类,那么,<Key>元素,不能重复。
B.UserInfo对象的查找也会存在问题,
这些缓存中的数据(UserInfo对象),在查找的时候是按什么来查找?是id还是name,还是别的什么?
如果是按照id查找,那就无所谓,key存放id就可以了。
如果按name来查找,key就应该存放name,如果数据库允许name重复存在,
那么,CacheMap这种缓存机制,就无法实现对UserInfo对象的快速查找定位,
创建这种缓存,也就没有什么意义。

读书人网 >J2SE开发

热点推荐