سلام من از مونگو از طریق مورفیا در جاوا استفاده میکنم
مشکلم اینه که کانکشن های مونگو هی زیاد و زیاد تر میشه تا اینکه سرورش دیگه جواب نمیده
من هر جا کانکت کردم پس از اتمام عملیات کانکتشن رو بستم اما نمی دونم مشکل کجاست که بازم بعضی و قتا باز می مونه
Printable View
سلام من از مونگو از طریق مورفیا در جاوا استفاده میکنم
مشکلم اینه که کانکشن های مونگو هی زیاد و زیاد تر میشه تا اینکه سرورش دیگه جواب نمیده
من هر جا کانکت کردم پس از اتمام عملیات کانکتشن رو بستم اما نمی دونم مشکل کجاست که بازم بعضی و قتا باز می مونه
شما دو جنبه رو باید بررسی کنی:
یکی اینکه گاهی مدل و معماری کانکشن زدن شما ایراد داره و داری بیخودی و زیاد کانکشن درست میکنی در حالیکه می تونستی کانکشن هات رو reuse بکنی.
دو اینکه جایی که نمیشه خیلی reuse کرد باید از Connection Pooling استفاده کنید تا تعداد کانکشن ها محدود بمونه.
Morphia از Connection Pooling پشتیبانی نمیکنه. اما کلاینت های دیگه هم هستن
و این رو هم بخون شاید از کانکشن هات درست استفاده نمیکنی.
من مودل استفادم فرق میکنه از مورفیا استفاده کردم
package framework;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Morphia;
import com.mongodb.Mongo;
import java.net.UnknownHostException;
public class MongoConnectionManager {
private static final MongoConnectionManager INSTANCE = new MongoConnectionManager();
private final Datastore ds;
private final Mongo mongo;
private final Morphia morphia = new Morphia();
public static final String DB_NAME = "Ordering";
public MongoConnectionManager() {
try {
mongo = new Mongo("localhost", 27017);
// mongo = new Mongo("localhost", 59482);
morphia.mapPackage("model");
ds = morphia.createDatastore(mongo, DB_NAME);
//t3
ds.ensureIndexes();
//test2
ds.ensureCaps();
} catch (UnknownHostException e) {
throw new RuntimeException("Error initializing mongo db", e);
}
}
public void close() {
mongo.close();
}
مثلا استفاده
MongoConnectionManager conMongo = new MongoConnectionManager();try {
OrderDao ordersDao = new OrderDaoImpl(Orders.class, conMongo.getDs());
DashboardManagment dashboard = (DashboardManagment) FacesContext.getCurrentInstance().getExternalConte xt().getSessionMap().get("dashboard");
ProvidersManagment ProviderM = (ProvidersManagment) FacesContext.getCurrentInstance().getExternalConte xt().getSessionMap().get("providerManager");
if (dashboard.getCurrentCustomer().getCustomerID() != null) {
this.addressList = ordersDao.getAddressOrders(dashboard.getCurrentCus tomer());
conMongo.close(); }
}
کلا هر جا کانکشن باز کردم بستم اما بازم وقتی برنامه اجرا میشه می بینی کانکشن باز مونده
حالا اگه بشه کلا کانکشن هارو بست یا یه کاری کرد خودشون خود بخود بسته بشن
خیلی خوب میشه
من به درایور Morphia آشنا نیستم ولی تحقیق کردم در هیچ مثال و توضیحی صحبتی از بستن کانکشن به میان نیامده است.حتی در مستندات اصلی مانگو دی بی برای Morphia هم مطرح شده که "آیا نیاز است که ارتباط بسته شود؟" که پاسخ داده شده که نیاز نیست.خود درایور همانطور که بهراد عزیز گفت Connection Pool برای هر نمونه یا Instance مانگو ساخته می شود.برای آزاد کردن منابع هم کافیه که از نمونه مانگو استفاده نشود و یا به احتمال زیاد نمونه یا Instance آزاد شود.منبع :
https://github.com/mongodb/morphia/w...AskedQuestions
با تشکر
مشکل من رفع شد علت ان بود که در بعضی مواقع کانکشن ها بسته نمی شد و با توجه به مراجعه زیاد به بانک تعداد کانکشن های باز بالا میرفت تا 2000 بعد منگو احتمالا بخاطر کم بود فضای رم دیگه کانکشن نمیداد. که خدا رو شکر بر طرف شد
..............
اما کانکشن هارو خودش نمی بست چرا که بر نامه همچنان اجرا بود و کانکشن ها هم باز می ماند
حالا شما می گین نیاز به بستن کانکشن نیست اون روش رو من بلد نیستم
همیشه باید مستندات کلاینت مورد نظرتون رو بخونید و سعی کنید همونطور که اون توصیه کرده از کانکشن ها استفاده کنید تا اینجور موارد پیش نیاد....
حتما
ممنون از راهنمای