MongoDB -- MongoClient串連池用法

來源:互聯網
上載者:User

主要的調整在於2.10.0版本中引入了MongoClient類,同時在其API中也說明了Mongo類會在將來的版本中被MongoClient替換(Note: This class has been superseded by MongoClient, and may be deprecated in a future release.)。故在這次調整中,也對原先的Mongodb部分做了相應的修改。

MongoClient被設計成安全執行緒、可以被多線程共用的。通常訪問資料庫叢集的應用只需要一個執行個體,所以這次調整我們設計成單例形式。如果出於某些原因,你決定使用多個執行個體,請注意:所有資源使用限制(最大串連數等等)對每個MongoClient都適用;銷毀一個執行個體時,請確認調用MongoClient.close()方法來清理資源。

下面給出相關的代碼:

    /**       * 項目名:SpiderCrawler       * 檔案名稱:MongoDBDao.java       * 作者:zhouyh       * 時間:2014-8-30 下午03:46:55       * 描述:TODO(用一句話描述該檔案做什麼)        */      package com.newsTest.dao;      import java.util.ArrayList;      import com.mongodb.DB;      import com.mongodb.DBCollection;      import com.mongodb.DBObject;      /**      * 類名: MongoDBDao      * 包名: com.newsTest.dao      * 作者: zhouyh      * 時間: 2014-8-30 下午03:46:55      * 描述: TODO(這裡用一句話描述這個類的作用)       */      public interface MongoDBDao {          /**          *           * 方法名:getDb          * 作者:zhouyh          * 建立時間:2014-8-30 下午03:53:40          * 描述:擷取指定的mongodb資料庫          * @param dbName          * @return          */          public DB getDb(String dbName);          /**          *           * 方法名:getCollection          * 作者:zhouyh          * 建立時間:2014-8-30 下午03:54:43          * 描述:擷取指定mongodb資料庫的collection集合          * @param dbName    資料庫名          * @param collectionName    資料庫集合          * @return          */          public DBCollection getCollection(String dbName, String collectionName);          /**          *           * 方法名:inSert          * 作者:zhouyh          * 建立時間:2014-8-30 下午04:07:35          * 描述:向指定的資料庫中添加給定的keys和相應的values          * @param dbName          * @param collectionName          * @param keys          * @param values          * @return          */          public boolean inSert(String dbName, String collectionName, String[] keys, Object[] values);          /**          *           * 方法名:delete          * 作者:zhouyh          * 建立時間:2014-8-30 下午04:09:00          * 描述:刪除資料庫dbName中,指定keys和相應values的值          * @param dbName          * @param collectionName          * @param keys          * @param values          * @return          */          public boolean delete(String dbName, String collectionName, String[] keys, Object[] values);          /**          *           * 方法名:find          * 作者:zhouyh          * 建立時間:2014-8-30 下午04:11:11          * 描述:從資料庫dbName中尋找指定keys和相應values的值          * @param dbName          * @param collectionName          * @param keys          * @param values          * @param num          * @return          */          public ArrayList<DBObject> find(String dbName, String collectionName, String[] keys, Object[] values, int num);          /**          *           * 方法名:update          * 作者:zhouyh          * 建立時間:2014-8-30 下午04:17:54          * 描述:更新資料庫dbName,用指定的newValue更新oldValue          * @param dbName          * @param collectionName          * @param oldValue          * @param newValue          * @return          */          public boolean update(String dbName, String collectionName, DBObject oldValue, DBObject newValue);          /**          *           * 方法名:isExit          * 作者:zhouyh          * 建立時間:2014-8-30 下午04:19:21          * 描述:判斷給定的keys和相應的values在指定的dbName的collectionName集合中是否存在          * @param dbName          * @param collectionName          * @param keys          * @param values          * @return          */          public boolean isExit(String dbName, String collectionName, String key, Object value);      } 
/**  * 項目名:SpiderCrawler  * 檔案名稱:MongoDBDaoImpl.java  * 作者:zhouyh  * 時間:2014-8-30 下午04:21:11  * 描述:TODO(用一句話描述該檔案做什麼)   */package com.newsTest.dao.impl;import java.net.UnknownHostException;import java.util.ArrayList;import com.newsTest.dao.MongoDBDao;import com.mongodb.BasicDBObject;import com.mongodb.DB;import com.mongodb.DBCollection;import com.mongodb.DBCursor;import com.mongodb.DBObject;import com.mongodb.MongoClient;import com.mongodb.MongoClientOptions;import com.mongodb.MongoException;import com.mongodb.WriteResult;/** * 類名: MongoDBDaoImpl * 包名: com.newsTest.dao.impl * 作者: zhouyh * 時間: 2014-8-30 下午04:21:11 * 描述: TODO(這裡用一句話描述這個類的作用)  */public class MongoDBDaoImpl implements MongoDBDao{    /**     * MongoClient的執行個體代表資料庫連接池,是安全執行緒的,可以被多線程共用,用戶端在多線程條件下僅維持一個執行個體即可     * Mongo是非安全執行緒的,目前mongodb API中已經建議用MongoClient替代Mongo     */    private MongoClient mongoClient = null;    /**     *      * 私人的建構函式     * 作者:zhouyh     */    private MongoDBDaoImpl(){        if(mongoClient == null){            MongoClientOptions.Builder build = new MongoClientOptions.Builder();                    build.connectionsPerHost(50);   //與目標資料庫能夠建立的最大connection數量為50            build.autoConnectRetry(true);   //自動重連資料庫啟動            build.threadsAllowedToBlockForConnectionMultiplier(50); //如果當前所有的connection都在使用中,則每個connection上可以有50個線程排隊等待            /*             * 一個線程訪問資料庫的時候,在成功擷取到一個可用資料庫連接之前的最長等待時間為2分鐘             * 這裡比較危險,如果超過maxWaitTime都沒有擷取到這個串連的話,該線程就會拋出Exception             * 故這裡設定的maxWaitTime應該足夠大,以免由於排隊線程過多造成的資料庫訪問失敗             */            build.maxWaitTime(1000*60*2);            build.connectTimeout(1000*60*1);    //與資料庫建立串連的timeout設定為1分鐘            MongoClientOptions myOptions = build.build();                   try {                //資料庫連接執行個體                mongoClient = new MongoClient("127.0.0.1", myOptions);                      } catch (UnknownHostException e) {                // TODO 這裡寫異常處理的代碼                e.printStackTrace();            } catch (MongoException e){                e.printStackTrace();            }        }    }    /********單例模式聲明開始,採用餓漢式方式產生,保證安全執行緒********************/    //類初始化時,自行執行個體化,餓漢式單例模式    private static final MongoDBDaoImpl mongoDBDaoImpl = new MongoDBDaoImpl();    /**     *      * 方法名:getMongoDBDaoImplInstance     * 作者:zhouyh     * 建立時間:2014-8-30 下午04:29:26     * 描述:單例的靜態Factory 方法     * @return     */    public static MongoDBDaoImpl getMongoDBDaoImplInstance(){        return mongoDBDaoImpl;    }    /************************單例模式聲明結束*************************************/    @Override    public boolean delete(String dbName, String collectionName, String[] keys,            Object[] values) {        DB db = null;        DBCollection dbCollection = null;        if(keys!=null && values!=null){            if(keys.length != values.length){   //如果keys和values不對等,直接返回false                return false;            }else{                try {                    db = mongoClient.getDB(dbName); //擷取指定的資料庫                    dbCollection = db.getCollection(collectionName);    //擷取指定的collectionName集合                    BasicDBObject doc = new BasicDBObject();    //構建刪除條件                    WriteResult result = null;  //刪除返回結果                    String resultString = null;                    for(int i=0; i<keys.length; i++){                        doc.put(keys[i], values[i]);    //添加刪除的條件                    }                    result = dbCollection.remove(doc);  //執行刪除操作                    resultString = result.getError();                    if(null != db){                        try {                            db.requestDone();   //請求結束後關閉db                            db = null;                        } catch (Exception e) {                            // TODO: handle exception                            e.printStackTrace();                        }                    }                    return (resultString!=null) ? false : true; //根據刪除執行結果進行判斷後返回結果                } catch (Exception e) {                    // TODO: handle exception                    e.printStackTrace();                } finally{                    if(null != db){                        db.requestDone();   //關閉db                        db = null;                    }                }            }        }        return false;    }    @Override    public ArrayList<DBObject> find(String dbName, String collectionName,            String[] keys, Object[] values, int num) {        ArrayList<DBObject> resultList = new ArrayList<DBObject>(); //建立返回的結果集        DB db = null;        DBCollection dbCollection = null;        DBCursor cursor = null;        if(keys!=null && values!=null){            if(keys.length != values.length){                return resultList;  //如果傳來的查詢參數對不對,直接返回空的結果集            }else{                try {                    db = mongoClient.getDB(dbName); //擷取資料庫執行個體                    dbCollection = db.getCollection(collectionName);    //擷取資料庫中指定的collection集合                    BasicDBObject queryObj = new BasicDBObject();   //構建查詢條件                    for(int i=0; i<keys.length; i++){   //填充查詢條件                        queryObj.put(keys[i], values[i]);                    }                                   cursor = dbCollection.find(queryObj);   //查詢擷取資料                    int count = 0;                    if(num != -1){  //判斷是否是返回全部資料,num=-1返回查詢全部資料,num!=-1則返回指定的num資料                        while(count<num && cursor.hasNext()){                            resultList.add(cursor.next());                            count++;                        }                        return resultList;                    }else{                        while(cursor.hasNext()){                            resultList.add(cursor.next());                        }                        return resultList;                    }                } catch (Exception e) {                    // TODO: handle exception                } finally{                                  if(null != cursor){                        cursor.close();                    }                    if(null != db){                        db.requestDone();   //關閉資料庫請求                    }                }            }        }        return resultList;    }    @Override    public DBCollection getCollection(String dbName, String collectionName) {        // TODO Auto-generated method stub        return mongoClient.getDB(dbName).getCollection(collectionName);    }    @Override    public DB getDb(String dbName) {        // TODO Auto-generated method stub        return mongoClient.getDB(dbName);    }    @Override    public boolean inSert(String dbName, String collectionName, String[] keys,            Object[] values) {        DB db = null;        DBCollection dbCollection = null;        WriteResult result = null;        String resultString = null;        if(keys!=null && values!=null){            if(keys.length != values.length){                return false;            }else{                db = mongoClient.getDB(dbName); //擷取資料庫執行個體                dbCollection = db.getCollection(collectionName);    //擷取資料庫中指定的collection集合                BasicDBObject insertObj = new BasicDBObject();                for(int i=0; i<keys.length; i++){   //構建添加條件                    insertObj.put(keys[i], values[i]);                }                try {                    result = dbCollection.insert(insertObj);                    resultString = result.getError();                } catch (Exception e) {                    // TODO: handle exception                    e.printStackTrace();                }finally{                    if(null != db){                        db.requestDone();   //請求結束後關閉db                    }                }                               return (resultString != null) ? false : true;            }        }        return false;    }    @Override    public boolean isExit(String dbName, String collectionName, String key,            Object value) {        // TODO Auto-generated method stub        DB db = null;        DBCollection dbCollection = null;        if(key!=null && value!=null){            try {                db = mongoClient.getDB(dbName); //擷取資料庫執行個體                dbCollection = db.getCollection(collectionName);    //擷取資料庫中指定的collection集合                BasicDBObject obj = new BasicDBObject();    //構建查詢條件                obj.put(key, value);                if(dbCollection.count(obj) > 0) {                    return true;                }else{                    return false;                }            } catch (Exception e) {                // TODO: handle exception                e.printStackTrace();            } finally{                if(null != db){                    db.requestDone();   //關閉db                    db = null;                }            }        }        return false;    }    @Override    public boolean update(String dbName, String collectionName,            DBObject oldValue, DBObject newValue) {        DB db = null;        DBCollection dbCollection = null;        WriteResult result = null;        String resultString = null;        if(oldValue.equals(newValue)){            return true;        }else{            try {                db = mongoClient.getDB(dbName); //擷取資料庫執行個體                dbCollection = db.getCollection(collectionName);    //擷取資料庫中指定的collection集合                result = dbCollection.update(oldValue, newValue);                resultString = result.getError();                return (resultString!=null) ? false : true;            } catch (Exception e) {                // TODO: handle exception                e.printStackTrace();            } finally{                if(null != db){                    db.requestDone();   //關閉db                    db = null;                }            }        }        return false;    }    /**     * 方法名:main     * 作者:zhouyh     * 建立時間:2014-8-30 下午04:21:11     * 描述:TODO(這裡用一句話描述這個方法的作用)     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub    }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.