用静态属性缓存有什么问题么?

吴红军 发布于 2012/03/03 15:41
阅读 945
收藏 0
package tqw.core.init;

import com.google.common.collect.Maps;
import com.google.common.collect.Range;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.dbutils.QueryLoader;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.text.StrBuilder;
import tqw.C;
import tqw.core.MultiKeyMap;
import tqw.core.ex.DaoException;
import tqw.core.ex.SysException;
import tqw.core.util.ClsLoader;
import tqw.core.util.Utils;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * <pre>数据库SQL</pre>
 * User: 吴红军.
 * Date: 12-3-2
 * Time: 下午7:15
 */

public class Sqls {
    private static final Map<String,Map<String,StringBuilder>> sqls= Maps.newConcurrentMap();
    private Sqls(){}
    //读取properties文件,载入SQL并且缓存在sqls缓存中
    public static void init(){
        InputStream is=null;
        Properties props=new Properties();
        try {
            is=ClsLoader.getStream(C.QUERIES);//获取SQL文件流
            props.load(is);
            for(String sqlk:props.stringPropertyNames()){
                String[] ks=sqlk.split("\\.");//分割
                StringBuilder sb=new StringBuilder(props.getProperty(sqlk));
                if(ks.length==2){
                    if(sqls.containsKey(ks[0])){
                        sqls.get(ks[0]).put(ks[1],sb);
                    }else{
                        Map<String, StringBuilder> queryMap = Maps.newHashMap();
                        queryMap.put(ks[1],sb);
                        sqls.put(ks[0],queryMap);
                    }
                }
                ks=null;sb=null;
            }
        } catch (IOException e) {
            throw new SysException("读取SQL文件错误!",e);
        }finally {
            IOUtils.closeQuietly(is);
            props.clear();
        }
    }
    public static StringBuilder getSql(final String prefix,final String name){
        return sqls.get(prefix).get(name);
    }
    public static StringBuilder comSql(final String tb,final String name,String...replace){
        StringBuilder sql=sqls.get(tb).get(name);
        if(sql!=null){
            return sql;
        }
        sql=sqls.get("all").get(name);
        if(sql==null){
            throw new DaoException("系统在执行查询时未读取到相应的查询语句!");
        }
        if(replace!=null&&replace.length>0){
            String[] dest={tb};
            sql=new StringBuilder(String.format(sql.toString(), Utils.addArray(dest, replace)));
        }else{
            sql=new StringBuilder(String.format(sql.toString(),tb));
        }
        if(sqls.containsKey(tb)){
            sqls.get(tb).put(name,new StringBuilder(sql));
        }else{
            Map<String,StringBuilder> newMap=Maps.newHashMap();
            newMap.put(name,sql);
            sqls.put(tb,newMap);
        }
        return sql;
    }
    public static void destroy(){
        sqls.clear();
    }
    public static void main(String[] args) throws ConfigurationException {
        long s=System.currentTimeMillis();
        Sqls.init();
        System.out.println(Sqls.comSql("album","gets","aid"));
        System.out.println((System.currentTimeMillis())-s);
        long e=System.currentTimeMillis();
        for(int i=0;i<5000;i++){
            System.out.println(Sqls.comSql("album","gets","aid"));
        }
        System.out.println((System.currentTimeMillis())-e);
        //init();
        //System.out.println(sqls.get("album.get_aid_uid")+sqls.size());
        //destroy();
    }
}

以下是属性文件:

#****************************************通用SQLS*****************************************#
all.get=SELECT * FROM tq_%s WHERE %s=?
all.gets=SELECT * FROM tq_%s WHERE %s=?
#****************************************相册SQLS*****************************************#
#--获取第一个相册
album.get_top=SELECT `aid` FROM tq_album WHERE uid=? ORDER BY `aid`
#--根据用户ID和相册ID获取相册信息
album.get_aid_uid=SELECT * FROM tq_album WHERE aid=? AND uid=?
#--获取用户的所有相册
album.gets_uid=SELECT * FROM tq_album WHERE uid=?
#--判断更改后的相册名称是否在用户的相册列表中存在此名称
album.existname_uid_aid=SELECT COUNT(*) FROM tq_album WHERE uid=? AND `name`=? AND aid<>?
#--判断用户的相册列表中是否存在当前相册名称
album.existname_uid=SELECT COUNT(*) FROM tq_album WHERE uid=? AND `name`=?
#--更新相册的数量
album.update_photonums=UPDATE tq_album AS a SET a.photonums=(SELECT COUNT(*) FROM tq_photo AS b WHERE a.aid=b.aid),a.mtime=? WHERE a.aid=?;
#--更新相册信息
album.update=UPDATE tq_album SET `name`=?,`info`=?,privacy=?,pwd=?,mtime=? WHERE aid=? AND uid=? LIMIT 1
#--更新相册的皮肤
album.update_skin=UPDATE tq_album SET skinid=?,skin=?,mtime=? WHERE aid=?


#****************************************个人联系信息SQLS*****************************************#

加载中
0
吴红军
吴红军
自己顶~!
0
ExtremeTalk
ExtremeTalk
你的问题是什么?就是标题?我没看懂
0
乱世键客
乱世键客
晕死。你在finally里面 props.clear()是想干神马?
0
吴红军
吴红军

引用来自“乱世键客”的答案

晕死。你在finally里面 props.clear()是想干神马?

这里可以这么做么?因为我转换成了Map了,这个东东我手动释放掉而已,不知道您的意见如何。

还想请问Map这样缓存SQL有问题么?

0
乱世键客
乱世键客

引用来自“吴红军”的答案

引用来自“乱世键客”的答案

晕死。你在finally里面 props.clear()是想干神马?

这里可以这么做么?因为我转换成了Map了,这个东东我手动释放掉而已,不知道您的意见如何。

还想请问Map这样缓存SQL有问题么?

clear就把所有的属性都清空了,不是“释放”。你释放掉还怎么用啊?
0
吴红军
吴红军

引用来自“乱世键客”的答案

引用来自“吴红军”的答案

引用来自“乱世键客”的答案

晕死。你在finally里面 props.clear()是想干神马?

这里可以这么做么?因为我转换成了Map了,这个东东我手动释放掉而已,不知道您的意见如何。

还想请问Map这样缓存SQL有问题么?

clear就把所有的属性都清空了,不是“释放”。你释放掉还怎么用啊?

因为我 是要把properties转换成map,您还没仔细看我的程序,上面都已经装到map里去了,所以我后面就清空了,自己放掉,不用jvm自动去清理。

0
吴红军
吴红军
我这里其实是把读取properties文件,按,分割键值,然后装到map中。
0
乱世键客
乱世键客

小伙子,建议看看JDK底层源码,clear方法到底是干什么用的。

0
吴红军
吴红军
只是清空键值对而已,调用的是hashtable的clear方法,我后面应该还加上props=null, 彻底干掉他 ;不明白这位想要表达的是什么?我清空和不清空运行结果都一样,只是我把它复制到map里面去了,我需要的是map,props里面的东西对我来说没用了,所以我清空了。
返回顶部
顶部