数据库代理

数据库代理,根据传递的字节码解析,数据库的连接暂未使用享元和数据库池优化


/**
 * Descroption:
 * Created by hjh on 2016/1/19.
 */
public class DBProxy{

    private static Map<Class, org.hjh.db.BaseDao> map = new HashMap<>();
    private static BaseDao baseDao = null;
    private static DBProxy instance;
    public static Context context;

    public static void init(Context x){
        context  = x;
    }

    public static void clearAll(){
        map.clear();
    }

    public static synchronized DBProxy getInstance(Class clazz){

        if(map.get(clazz) == null){
            baseDao = new BaseDao(context,DBManager.getInstance(context, "xx").openSystemDatabase(),false,clazz) {
                @Override
                public String getTableName() {
                    return super.getTableName();
                }

            };

            map.put(clazz,baseDao);
        }else{
            baseDao = map.get(clazz);
        }

        if(instance == null){
            instance = new DBProxy();
        }

       return instance;
    }

    /**
     * 使用前需要打开数据库
     */
    private  void openCurrentDataBase () {
        baseDao.openDataBase(DBManager.getInstance(context, "xx").openSystemDatabase(), false);
    }

    /**
     * 插入数据
     * @param bean
     */
    public void insert(Serializable bean ){

        if(bean == null){
            return;
        }
        openCurrentDataBase();
        baseDao.save(bean);
    }

    public void insertList(List<Serializable> list){
        if(list == null){
            return;
        }

        for(Serializable item : list){
            insert(item);
        }
    }

    /**
     * 按条件删除产品,key ,value顺序需要一致
     * */
    public int deleteByCondition(String [] keys,String[] values) {

        if(keys == null)return 0;
        StringBuilder builder = new StringBuilder();
        for(int index = 0; index < keys.length; index ++){
            if(index == 0){
                builder.append(keys[index]+"=?");
            }else {
                builder.append(" and "+ keys[index]+ "=?");
            }
        }

        openCurrentDataBase();
        return baseDao.removeByCondition(builder.toString(),
                values);
    }

    /**
     * 删除某表的所有数据
     */
    public void deleteAll(){
        openCurrentDataBase();
        baseDao.removeBySQL("delete from " + baseDao.getTableName());
    }

    /**
     * 根据主键跟新,可被 update替换
     * @param primaryKeyValue 主键值
     * @param params
     */
    public void updateByPrimaryKey(String primaryKeyValue, Map<String,Object> params) {
        openCurrentDataBase();
        ContentValues contentValues = new ContentValues();
        for (String key : params.keySet()) {
            Object object = params.get(key);
            if(object instanceof String){
                contentValues.put(key, (String)params.get(key));
            }else if(object instanceof  Boolean){
                contentValues.put(key, (Boolean)params.get(key));
            }else if (object instanceof Float){
                contentValues.put(key, (Float)params.get(key));
            }else if (object instanceof Integer){
                contentValues.put(key, (Integer)params.get(key));
            }else if (object instanceof Double){
                contentValues.put(key, (Double)params.get(key));
            }

        }

        baseDao.updateByPrimaryKey(primaryKeyValue, contentValues);
    }

    /**
     * 更新
     * @param values  筛选条件值
     * @param params 跟新的参数
     * @param keys 跟新条件key 例如: fromSubId=?
     */
    public void update(String[] keys,String[] values,Map<String,Object> params) {
        openCurrentDataBase();
        ContentValues contentValues = new ContentValues();
        for (String key : params.keySet()) {
            Object object = params.get(key);
            if(object instanceof String){
                contentValues.put(key, (String)params.get(key));
            }else if(object instanceof  Boolean){
                contentValues.put(key, (Boolean)params.get(key));
            }else if (object instanceof Float){
                contentValues.put(key, (Float)params.get(key));
            }else if (object instanceof Integer){
                contentValues.put(key, (Integer)params.get(key));
            }else if (object instanceof Double){
                contentValues.put(key, (Double)params.get(key));
            }else if (object instanceof Long){
                contentValues.put(key, (Long)params.get(key));
            }
        }

        StringBuilder builder = new StringBuilder();
        for(int index = 0; index < keys.length; index ++){
            if(index == 0){
                builder.append(keys[index]+"=?");
            }else {
                builder.append(" and "+ keys[index]+ "=?");
            }
        }
        baseDao.update(contentValues, builder.toString(), values);
    }

    public void upDate(Serializable entity) {
        openCurrentDataBase();
        baseDao.upDate(entity);
    }

    /**查找数量*/
    public Long queryCount(String[] keys,String[] values) {

        openCurrentDataBase();
        StringBuilder builder = new StringBuilder();
        for(int index = 0; index < keys.length; index ++){
            if(index == 0){
                builder.append(keys[index]+"=?");
            }else {
                builder.append(" and "+ keys[index]+ "=?");
            }
        }

        return baseDao.getCount(
                "select count(*)  from " + baseDao.getTableName() + " where " + builder.toString(), values);

    }

    /**
     * 查询某表的所有数据
     * @return
     */
    public List<Serializable> queryAll(){

        openCurrentDataBase();
        List<Serializable> list = baseDao.queryPageData("select * from " + baseDao.getTableName(), null);

        return list;
    }

    //m默认降序
    public List<Serializable> queryPageBySort(String sortKey,String[] keys,String[]values){
        return queryPageBySort(sortKey,keys,values,2);
    }

    /**
     * 按顺序获取
     * @param keys 	查找条件
     * @param values 最后2个value代表查找的下标和一页的数量,条件中不需要,下标计算int fromIndex = (pageNum - 1) * pageSize;
     * @param sortType 排序类型 1:升序,2:降序
     * @param sortKey 排序的key
     * @return
     */
    public List<Serializable> queryPageBySort(String sortKey,String[] keys,String[]values,int sortType) {
        openCurrentDataBase();

        String sortStr = sortType == 1 ? "asc": "desc";
        StringBuilder builder = new StringBuilder();
        for(int index = 0; index < keys.length; index ++){
            if(index == 0){
                builder.append(keys[index]+"=?");
            }else {//
                builder.append(" and "+ keys[index]+ "=?");
            }
        }
        //limit 5 offset 3也是分页查找句获取5条记录,跳过前面3条记录
        List<Serializable> list = baseDao.queryPageData(
                "select * from " + baseDao.getTableName() + " where " + builder.toString() + " order by " + sortKey + " " + sortStr + " limit ? , ? ", values);
        return list;

    }

    /**
     * 条件或查询
     * @param sortKey
     * @param orkeys 需要查找的字段名
     * @param text 查询的内容
     * @param values 分页的限制条件,下标和数量
     * @param sortType
     * @return
     */
    public List<Serializable> queryBySearch(String sortKey,String[] andkeys,String[] orkeys,String text, String[]values,int sortType){
        openCurrentDataBase();
        String sortStr = sortType == 1 ? "asc": "desc";
        StringBuilder builder = new StringBuilder();
        for(int index = 0; index < andkeys.length; index ++){
            if (index == 0) {
                builder.append(andkeys[index] + "=?");
            } else {//
                builder.append(" and " + andkeys[index] + "=?");
            }
        }

        if(!builder.toString().isEmpty()) {//非空
            builder.append(" and (");
        }

        for(int index = 0; index < orkeys.length; index ++){
            if (index == 0) {
                builder.append(orkeys[index] + " glob '*" + text + "*'");
            } else {//
                builder.append(" or " + orkeys[index] + " glob '*" + text + "*')");
            }
        }

        //limit 5 offset 3也是分页查找句获取5条记录,跳过前面3条记录
        List<Serializable> list = baseDao.queryPageData(
                "select * from " + baseDao.getTableName() + " where " + builder.toString() + " order by " + sortKey + " " + sortStr + " limit ? , ? ", values);
        return list;


    }

    /**
     * 按条件获取对象
     * @param keys
     * @param values
     * @return
     */
    public Serializable queryObject(String[] keys,String[]values){
        openCurrentDataBase();

        StringBuilder builder = new StringBuilder();
        for(int index = 0; index < keys.length; index ++){
            if(index == 0){
                builder.append(keys[index]+"=?");
            }else {//
                builder.append(" and "+ keys[index]+ "=?");
            }
        }

        return baseDao.queryForObject("select * from " + baseDao.getTableName() + " where " + builder.toString(), values);
    }

    /**
     * 根据条件查找是否存在
     * @param keys
     * @param values
     * @return
     */
    public boolean isExist(String[] keys,String[]values){
        openCurrentDataBase();

        StringBuilder builder = new StringBuilder();
        for(int index = 0; index < keys.length; index ++){
            if(index == 0){
                builder.append(keys[index]+"=?");
            }else {//
                builder.append(" and "+ keys[index]+ "=?");
            }
        }

        return baseDao.isExistsBySQL("select count(*)  from " + baseDao.getTableName() + " where " + builder.toString(), values);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
奇虎360公司开源的Atlas是优秀的数据库中间件,美团点评DBA团队针对公司内部需求,在其上做了很多改进工作,形了新的高可靠、高可用企业级数据库中间件DBProxy,已在公司内部生产环境广泛使用,较为熟、稳定。 DBProxy的优点 支持多语言MySQL客户端 读写分离 负载均衡 Slave故障感知与摘除(Master需要MHA等其他联动) 后端连接池 自定义SQL拦截与过滤 流量分组与控制 丰富的监控状态 支持分表(分库版本正在内测中) Client IP限制 DBProxy对Atlas的改进 新增功能点 新增参数 backend-max-thread-running用于指定每个MySQL后台的最大thread running数 thread-running-sleep-delay用于指定在thread running数超过backend-max-thread-running时,客户端连接等待的时间 添加到黑名单中需要满足两个条件:SQL执行的时间和频率 提供了查看、修改、添加、删除黑名单的功能 黑名单管理提供了将黑名单保存到文件以及从文件中Load到内存中的功能 在手动添加黑名单时,只需要将用户的SQL语句输入,在内部自动转化过滤条件,手动添加时是否生效由参数 manual-filter-flag 来控制,OFF:不生效,ON:立即生效 手动添加与自动添加两种情况下的过滤条件是否生效是分别由不同参数控制,这个要区分清楚。另外,也可以使用 admin 的命令来设置是否开启/关闭某个过滤条件 SQL执行的时间 由参数 query-filter-time-threshold 来指定,如果SQL执行时间超过此值,则满足条件 SQL执行频率 由参数 query-filter-frequent-threshold 来指定,如果SQL执行频率超过此值,则满足条件 频率就是在时间窗口内执行的次数。时间窗口则是由频率阈值和最小执行次数来计算出来的,当时间窗口小于60s时,扩展到60s 参数 access-num-per-time-window 用来指定在时间窗口内的最小执行次数,添加此参数是考虑到执行时间长的SQL在计算频率时同时参考其执行的次数,只有执行一定次数时才去计算其频率。当执行时间与执行频率都满足时条件时,会自动将查询作为过滤项放到黑名单中,加入到黑名单中是否生效由参数 auto-filter-flag 来控制,OFF:不生效,ON:立即生效 黑名单的管理 从库流量配置 指定查询发送到某个从库 参数动态设置(完善show proxy status/variables) 支持save config,动态增加、删除分表 响应时间percentile统计 统计最近时间段DBProxy的响应时间 kill session 支持DBProxy的admin接口kill session操作 backend平滑上下线 支持平滑的backend上下线 DBProxy非root用户启动 使用非root用户启动 admin账号的安全限制 admin账号密码的动态修改及host限制 增加异步刷日志的功能 增加日志线程、异步刷日志,提高响应时间 支持DBProxy平滑重启功能 支持SQL过滤的黑名单功能 支持对于MySQL后台的thread running限制功能 该功能通过在DBProxy内限制每个后台MySQL的并发查询,来控制对应MySQL的thread running数 当发向某个MySQL后台的的并发查询超过某个阈值时,会进行超时等待,直到有可用的连接,其中阈值与超时等待的时间都已经参数化,可以动态配置 set backend offline不再显示节点状态 支持set transaction isolation level 支持use db 支持set option语句 支持set session级系统变量 支持建立连接时指定连接属性 改进连接池的连接管理,增加超时释放机制。当连接池中的空闲连接闲置超过一定时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值