2013-07-23 12 views
6

Tôi có nhật ký sau đây trong giao diện điều khiển Mongo tôi:MongoDB kết nối mở vấn đề

Tue Jul 23 17:20:01.301 [initandlisten] waiting for connections on port 27017 
Tue Jul 23 17:20:01.401 [websvr] admin web console waiting for connections on port 28017 
Tue Jul 23 17:20:01.569 [initandlisten] connection accepted from 127.0.0.1:58090 #1 (1 connection now open) 
Tue Jul 23 17:20:01.570 [initandlisten] connection accepted from 127.0.0.1:58089 #2 (2 connections now open) 
Tue Jul 23 17:20:21.799 [initandlisten] connection accepted from 127.0.0.1:58113 #3 (3 connections now open) 
.... 
.... 
.... 

tương tự như vậy nhật ký đi và bây giờ nó là ở 112. Mỗi lần khi tôi khởi động máy chủ Mongo điều này xảy ra. Tôi chỉ có một kết nối singleton trong mã của tôi. Điều gì có thể là vấn đề ở đây:

public static DB getConnection(String databaseName) throws AppConnectionException { 

    if (null != db) { 
     Logger.debug("Returning existing db connection...!"); 
     return db; 
    } 

    Logger.debug("Creating new db connection...!"); 
    final String connStr = PropertyRetreiver.getPropertyFromConfigurationFile("rawdata.url"); 

    try { 

     final MongoClientURI uri = new MongoClientURI(connStr); 
     final MongoClient client = new MongoClient(uri); 
     db = client.getDB(databaseName); 

    } catch (UnknownHostException e) { 
     throw new AppConnectionException(
       "Unable to connect to the given host/port."); 
    } 

    return db; 
} 
+0

Có nhiều phương pháp? Bạn có thể làm cho nó 'đồng bộ'? – bsd

+0

DAO của tôi sẽ gọi phương thức lớp trình kết nối này để nhận kết nối. Ngoài ra kết nối này là một singleton tĩnh, vì vậy tôi hy vọng nó chỉ có một kết nối tại một thời điểm nhất định .... Vì vậy, tại sao tôi cần đồng bộ ở đây ??? – popcoder

Trả lời

8

MongoClient có hồ bơi kết nối nội bộ. Số lượng kết nối tối đa có thể được cấu hình (mặc định là 100). Bạn có thể đặt nó bằng cách sử dụng MongoClientOptions như thế này:

MongoClientOptions options = MongoClientOptions.builder() 
       .connectionsPerHost(100) 
       .autoConnectRetry(true) 
       .build(); 

Và sau đó cung cấp các tùy chọn để MongoClient (kiểm tra nó trong Mongo Java API v2.11.1). Các kết nối trong hồ bơi được duy trì mở (kết nối mở và đóng thường là một hoạt động tốn kém) để chúng có thể được sử dụng lại sau này.

Tôi cũng sẽ cấu trúc lại máy khách MongoDB singleton của bạn bằng cách sử dụng enum ví dụ để tránh đặt synchronized vào phương pháp này.

Đây là một phác thảo về những gì tôi có nghĩa là:

public enum MongoDB { 
    INSTANCE; 

    private static final String MONGO_DB_HOST = "some.mongohost.com"; 
    private Mongo mongo; 
    private DB someDB; 

    MongoDB() { 

     MongoClientOptions options = MongoClientOptions.builder() 
       .connectionsPerHost(100) 
       .autoConnectRetry(true) 
       .readPreference(ReadPreference.secondaryPreferred()) 
       .build(); 

     try { 
      mongo = new MongoClient(MONGO_DB_HOST, options); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 

     someDB = mongo.getDB("someDB"); 
     //authenticate if needed 
     //boolean auth = someDB.authenticate("username", "password".toCharArray()); 
     //if(!auth){ 
     //  System.out.println("Error Connecting To DB"); 
     //}   
    } 

    public DB getSomeDB() { 
     return someDB; 
    } 

    //call it on your shutdown hook for example 
    public void close(){ 
     mongo.close(); 
    } 
} 

Sau đó, bạn có thể truy cập vào cơ sở dữ liệu của bạn thông qua

MongoDB.INSTANCE.getSomeDB().getCollection("someCollection").count(); 
+0

Tôi mong đợi chỉ có một kết nối hoạt động tại một thời điểm nhất định, đó là lý do tại sao tôi đã làm cho nó như là một singleton tĩnh. Cấu hình số kết nối sẽ giúp ích như thế nào? – popcoder

+0

Ngoài ra, bạn có thể vui lòng cập nhật với việc tái cấu trúc bạn đã đề cập không? – popcoder

+0

Yêu cầu của bạn có nguồn gốc như thế nào? Nó có được gửi qua trình duyệt không? Vui lòng mô tả luồng trong câu hỏi. Cập nhật liên quan đến singleton. –