2014-11-13 22 views
5

Tôi đang cố gắng thiết kế lớp kết nối Mongo Db nơi tôi đang bảo trì MongoClient là tĩnh.Đóng kết nối Java MongoDB

private static MongoClient client = null; 

public static DB connectToMongo() throws Exception { 
    if (null != client) { 
     return client.getDB(DBNAME); 
    }  
    client = new MongoClient(HOST,PORT);     
    return client.getDB(DBNAME);  
} 

toàn bộ ứng dụng web của tôi sử dụng các phương pháp trên để kết nối với Mongo như sau:

db = MongoDBConnection.connectToMongo(); 
collection = db.getCollection("collectionName"); 

Sau khi thực hiện các hoạt động DB Tôi chưa bao giờ gọi kết nối chặt chẽ cho MongoClient. Lớp kết nối sẽ luôn luôn trả về cùng một cá thể của MongoClient mà không bao giờ bị đóng. Điều duy nhất tôi đóng là con trỏ.

  • Có cần phải đóng MongoClient mỗi lần chúng tôi truy vấn cơ sở dữ liệu không? Thiết kế trên của tôi có hợp lệ không?

Trả lời

15

Bạn chắc chắn không đóng MongoClient mỗi khi bạn truy vấn cơ sở dữ liệu. MongoClient duy trì một hồ bơi kết nối, tương đối đắt để thiết lập, vì vậy bạn sẽ muốn sử dụng lại cá thể MongoClient trong suốt thời gian tồn tại của ứng dụng web của bạn.

Một vài thứ khác để chỉ ra:

  • Có một tình trạng chủng tộc trong phương pháp connectToMongo. Bạn cần phải đồng bộ hóa quyền truy cập vào phương thức đó để đảm bảo rằng tối đa một phiên bản của MongoClient được tạo ra.
  • Nếu bạn đã từng triển khai lại ứng dụng web của mình mà không cần khởi động lại máy chủ ứng dụng, bạn phải đảm bảo rằng MongoClient được đóng khi ứng dụng web của bạn tắt. Bạn có thể làm điều đó, ví dụ, với một ServletContextListener.
+0

Điều đó có ý nghĩa .... Cảm ơn các bạn! – ecnoir

Các vấn đề liên quan