请教超级高手,要怎么样把一张表中的100百万条记录的20万条记录,放到内存里

liuzhengkang 2008-10-10 03:17:33
可能题目有点不明确,。。我这样说好了:

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

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

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

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

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


下面这图是刚刚画的操作数据库图,希望大家能看懂、、、
...全文
567 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2008-10-11
  • 打赏
  • 举报
回复
如果非要用Map存放数据,就自己写一个实现类来完成缓存的功能。
JDK所提供的工具,只是程序员所使用的基本工具。
对于较特殊的需求,还是要程序员自己来编写,或者,扩展JDK中一些类来实现的。
我在你的同名帖子里面已经回复了,
自己写一个LinkedHashMap的扩展类,就能解决楼主的问题。
kidyou 2008-10-11
  • 打赏
  • 举报
回复
可以使用WeakHashMap,使用跟HashMap类似,不过它可以满足你的 把那很少访问的记录自动删除掉 的需求
colinwj 2008-10-11
  • 打赏
  • 举报
回复
HashMap的容量会自动增加的,你设置也没用,可以加个计数器
IceCraft 2008-10-11
  • 打赏
  • 举报
回复
实在看不懂你那个流程图,可能我太菜了。。。
不过对于数据缓存你可以考虑采用缓存框架,而不是简单的拿HashMap来实现,这样很容易造成内存泄漏,而且性能方面也并不理想。
建议是底层加入Hibernate并配置OSCache或EhCache缓存框架。这样你在编写程序过程中不用考虑缓存问题,而是在执行查询时由Hibernate来判断你的sql是否已经执行过,然后找出被缓存框架缓存的数据。使用这种机制你就不必预先载入这么大量的数据,而是每次执行sql才将结果集中的部分对象缓存备用。而且可以设置缓存池的容量,超出缓存池的部分采用文件系统缓存等等。
liuzhengkang 2008-10-11
  • 打赏
  • 举报
回复
在这里先要感谢大家,现在已基本实现了,只是不知道怎么控制HashMap的容量,再次请问一下大家,
这里是返回hashmap的代码:

   
public HashMap getHashmap(String sql){
HashMap<Integer,UserInfo> hashmap = new HashMap<Integer,UserInfo>(200000); //这里初始化200000没有作用啊!!!!
SQLConnect sqlc = new SQLConnect();
ResultSet rs = null;
try{
rs = sqlc.query(sql); //执行查询
while(rs.next()){
int id = Integer.parseInt(rs.getString(1));
String name = rs.getString(2);
String password = rs.getString(3);
int status = Integer.parseInt(rs.getString(4));
UserInfo ui = new UserInfo(id,name,password,status); //记录封装在UserInfo类
hashmap.put(id,ui);
}
}catch(Exception e){
System.out.println(e.getMessage());
}
return hashmap;
}


HashMap <Integer,UserInfo> hashmap = new HashMap <Integer,UserInfo>(200000);
这一句控制容量的控制不了,(我把结果get出来了)结果是把一张表中50万条记录都保存到hashmap里去了,我只想要保存表中的20万啊!!请问这个要怎么实现啊!
马老虎 2008-10-10
  • 打赏
  • 举报
回复
调用 存储过程 把一部分数据取出来!!
huangyangweiyue 2008-10-10
  • 打赏
  • 举报
回复
20W记录放内存中 不太可能,我觉得LZ还是打消这种念头。如果用hibernate的话可以控制2级缓存。不过还是不建议用。
还是觉得换种思路,比如做个临时表。调用一个存储过程,触发一个触发器。在数据层导数据比较现实,负载要小的多。
ZHANGBINFLY 2008-10-10
  • 打赏
  • 举报
回复
关注
sasgsc 2008-10-10
  • 打赏
  • 举报
回复
怎么想都没有好办法......建立索引吧还是............
colinwj 2008-10-10
  • 打赏
  • 举报
回复
感觉像学操作系统时候的内存页面替换算法,有先进先出,最近最少使用等,关键是算法问题,这个应该没有专门的类,需要自己实现
冰思雨 2008-10-10
  • 打赏
  • 举报
回复
我已经写的很清楚了呀。
liuzhengkang 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 preferme 的回复:]
要自己写缓存了。
还有,20万的数据,有可能会把JVM的内存暴掉。

主要还是要看实际情况,
就是说,你的程序的重点,是要解决查询操作的频繁响应,还是要提高查询的响应速度。

我这里,只有通过name字段来查找记录的解决方案。对于多个字段的联合查找,以及条件查询,目前还没有较迅捷的方式。

我的简单解决方案是:
针对记录表,写一个对应的类。它的一条记录,对应一个对象。
这个类要重写hasCode方法,使得返回name的…
[/Quote]
是不是用Hashmap啊,key为查找的条件name,values为UserInfo对象。
UserInfo ui = new UserInfo(id,name,password,membercode,status); <---记录都保存在这里
冰思雨 2008-10-10
  • 打赏
  • 举报
回复
超类的第二个参数,不要太小,要是不知道设置成多少,就设置成1f好了。

其他的部分,按照我的思路,楼主就可以完成了吧 ?
冰思雨 2008-10-10
  • 打赏
  • 举报
回复
要自己写缓存了。
还有,20万的数据,有可能会把JVM的内存暴掉。

主要还是要看实际情况,
就是说,你的程序的重点,是要解决查询操作的频繁响应,还是要提高查询的响应速度。

我这里,只有通过name字段来查找记录的解决方案。对于多个字段的联合查找,以及条件查询,目前还没有较迅捷的方式。

我的简单解决方案是:
针对记录表,写一个对应的类。它的一条记录,对应一个对象。
这个类要重写hasCode方法,使得返回name的hasCode值。
写一个Cache类,扩展LinkedHashMap,重写removeEldestEntry方法。
Cache类里面的Key存放name,Value存放对象本身。
在构造器中,调用超类的构造方法时,选择三个参数的构造器,并且,第三个参数accessOrder要设置成true。
然后

protected boolean removeEldestEntry(Entry eldest) {
if(size()<=cacheSize)return false;//cacheSize设置成20万
return true;
}
liuzhengkang 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cuizm 的回复:]
你的想法是对的,可以先将一部分数据放到内存中,以减少数据库的访问,但是20万条都放到内存里就不太好了,一是加载的时候慢,二是占用的内存也比较多。
可以少放一些。可以放到数组中。

天狼工作室
http://www.j2soft.cn
[/Quote]
那一般要放多少条记录到内存里比较好,
还有要怎样把记录放在数组里啊...~.~
haode 2008-10-10
  • 打赏
  • 举报
回复
20万对于内存的占用太大了.
liuzhengkang 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kunshan_shenbin 的回复:]
可以使用缓存啊。
不过20W条记录一直放在内存里可不好,还是以文件的形式保存到硬盘上吧。
不知道你的Dao层用的什么,Hibernate,ibatis等也都支持缓存技术的。
[/Quote]
现在只是写个程序测试一下这样的模型啊,可以的吗?
射天狼 2008-10-10
  • 打赏
  • 举报
回复
你的想法是对的,可以先将一部分数据放到内存中,以减少数据库的访问,但是20万条都放到内存里就不太好了,一是加载的时候慢,二是占用的内存也比较多。
可以少放一些。可以放到数组中。

天狼工作室
http://www.j2soft.cn
yami251139 2008-10-10
  • 打赏
  • 举报
回复
用2级缓存吧
具体多少时间更新一次按需求看着办
ooo19841080xinxin 2008-10-10
  • 打赏
  • 举报
回复
关注
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧