可能题目有点不明确,。。我这样说好了:由于我的程序要大量访问数据库中的记录的,如果要读一条记录的话就要访问一次数据库,(数据库已使用了连接池)。所以如果我把一部分记录(20万条)放到内存里的话就可以大大减少读数据库中记录的次数,它在内存里找到有的话就直接从内存里取了,而不用再访问数据库。当然如果在程序里又能加以判断那些记录是经常要访问的,那些是很少访问的,然后就把那很少访问的记录自动删除掉的话,性能又更不错了。请问一下大家,这个用java要怎么实现,要使用那些类、那些方法比较好,先谢谢了!!数据库表users中的字段只有(id,name,password,membercode,status)。下面这图是刚刚画的操作数据库图,希望大家能看懂、、、
解决方案 »
- eclipse3.5.1安装插件问题
- 为什么str.getBytes("gbk")拿到的不是正确的gbk编码?
- 请问 2个大小不同的图片,怎么实现按位置叠加(小的图片按位置覆盖大的图片的某区域),形成一个图片?
- 我自己写了个修改客户信息的程序,但是无法连接数据库进行修改,运行时也没有报错。
- java新手提问,关于数组
- jdbc自动提交的问题
- 用applet链接数据库.....?
- 一个接口的问题
- 怎么会抖动 估计是repaint方法的原因
- 运行时的出错提示!
- 一个简单的程序,麻烦帮忙注释一下,谢谢了!
- 快烦死了 为什么我的jcreator 用了这么久没出问题,今天连个小小的helloword程序却只能编译而不能运行啊?
不过20W条记录一直放在内存里可不好,还是以文件的形式保存到硬盘上吧。
不知道你的Dao层用的什么,Hibernate,ibatis等也都支持缓存技术的。
可以少放一些。可以放到数组中。天狼工作室
http://www.j2soft.cn
还有,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;
}
UserInfo ui = new UserInfo(id,name,password,membercode,status); <---记录都保存在这里
还是觉得换种思路,比如做个临时表。调用一个存储过程,触发一个触发器。在数据层导数据比较现实,负载要小的多。
这里是返回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万啊!!请问这个要怎么实现啊!
不过对于数据缓存你可以考虑采用缓存框架,而不是简单的拿HashMap来实现,这样很容易造成内存泄漏,而且性能方面也并不理想。
建议是底层加入Hibernate并配置OSCache或EhCache缓存框架。这样你在编写程序过程中不用考虑缓存问题,而是在执行查询时由Hibernate来判断你的sql是否已经执行过,然后找出被缓存框架缓存的数据。使用这种机制你就不必预先载入这么大量的数据,而是每次执行sql才将结果集中的部分对象缓存备用。而且可以设置缓存池的容量,超出缓存池的部分采用文件系统缓存等等。
JDK所提供的工具,只是程序员所使用的基本工具。
对于较特殊的需求,还是要程序员自己来编写,或者,扩展JDK中一些类来实现的。
我在你的同名帖子里面已经回复了,
自己写一个LinkedHashMap的扩展类,就能解决楼主的问题。