可能题目有点不明确,。。我这样说好了:由于我的程序要大量访问数据库中的记录的,如果要读一条记录的话就要访问一次数据库,(数据库已使用了连接池)。所以如果我把一部分记录(20万条)放到内存里的话就可以大大减少读数据库中记录的次数,它在内存里找到有的话就直接从内存里取了,而不用再访问数据库。当然如果在程序里又能加以判断那些记录是经常要访问的,那些是很少访问的,然后就把那很少访问的记录自动删除掉的话,性能又更不错了。请问一下大家,这个用java要怎么实现,要使用那些类、那些方法比较好,先谢谢了!!数据库表users中的字段只有(id,name,password,membercode,status)。下面这图是刚刚画的操作数据库图,希望大家能看懂、、、

解决方案 »

  1.   

    可以使用缓存啊。
    不过20W条记录一直放在内存里可不好,还是以文件的形式保存到硬盘上吧。
    不知道你的Dao层用的什么,Hibernate,ibatis等也都支持缓存技术的。
      

  2.   

    你的想法是对的,可以先将一部分数据放到内存中,以减少数据库的访问,但是20万条都放到内存里就不太好了,一是加载的时候慢,二是占用的内存也比较多。
    可以少放一些。可以放到数组中。天狼工作室
    http://www.j2soft.cn
      

  3.   

    要自己写缓存了。
    还有,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;
    }
      

  4.   

    是不是用Hashmap啊,key为查找的条件name,values为UserInfo对象。
    UserInfo ui = new UserInfo(id,name,password,membercode,status); <---记录都保存在这里
      

  5.   

    20W记录放内存中 不太可能,我觉得LZ还是打消这种念头。如果用hibernate的话可以控制2级缓存。不过还是不建议用。
    还是觉得换种思路,比如做个临时表。调用一个存储过程,触发一个触发器。在数据层导数据比较现实,负载要小的多。
      

  6.   

    在这里先要感谢大家,现在已基本实现了,只是不知道怎么控制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万啊!!请问这个要怎么实现啊!
      

  7.   

    实在看不懂你那个流程图,可能我太菜了
    不过对于数据缓存你可以考虑采用缓存框架,而不是简单的拿HashMap来实现,这样很容易造成内存泄漏,而且性能方面也并不理想。
    建议是底层加入Hibernate并配置OSCache或EhCache缓存框架。这样你在编写程序过程中不用考虑缓存问题,而是在执行查询时由Hibernate来判断你的sql是否已经执行过,然后找出被缓存框架缓存的数据。使用这种机制你就不必预先载入这么大量的数据,而是每次执行sql才将结果集中的部分对象缓存备用。而且可以设置缓存池的容量,超出缓存池的部分采用文件系统缓存等等。
      

  8.   

    HashMap的容量会自动增加的,你设置也没用,可以加个计数器
      

  9.   

    可以使用WeakHashMap,使用跟HashMap类似,不过它可以满足你的 把那很少访问的记录自动删除掉 的需求
      

  10.   

    如果非要用Map存放数据,就自己写一个实现类来完成缓存的功能。
    JDK所提供的工具,只是程序员所使用的基本工具。
    对于较特殊的需求,还是要程序员自己来编写,或者,扩展JDK中一些类来实现的。
    我在你的同名帖子里面已经回复了,
    自己写一个LinkedHashMap的扩展类,就能解决楼主的问题。