PDA

View Full Version : mongoDB در MOrphia



hassanmosavi
یک شنبه 15 تیر 1393, 11:10 صبح
سلام من از مونگو از طریق مورفیا در جاوا استفاده میکنم
مشکلم اینه که کانکشن های مونگو هی زیاد و زیاد تر میشه تا اینکه سرورش دیگه جواب نمیده
من هر جا کانکت کردم پس از اتمام عملیات کانکتشن رو بستم اما نمی دونم مشکل کجاست که بازم بعضی و قتا باز می مونه

cups_of_java
یک شنبه 15 تیر 1393, 12:44 عصر
شما دو جنبه رو باید بررسی کنی:
یکی اینکه گاهی مدل و معماری کانکشن زدن شما ایراد داره و داری بیخودی و زیاد کانکشن درست میکنی در حالیکه می تونستی کانکشن هات رو reuse بکنی.
دو اینکه جایی که نمیشه خیلی reuse کرد باید از Connection Pooling استفاده کنید تا تعداد کانکشن ها محدود بمونه.

Morphia از Connection Pooling پشتیبانی نمیکنه. اما کلاینت های دیگه هم هستن (http://docs.mongodb.org/ecosystem/drivers/java/)
و این رو هم بخون شاید از کانکشن هات درست استفاده نمیکنی. (http://docs.mongodb.org/ecosystem/drivers/java-concurrency/#java-driver-concurrency)

hassanmosavi
دوشنبه 16 تیر 1393, 08:39 صبح
من مودل استفادم فرق میکنه از مورفیا استفاده کردم




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(); }
}


کلا هر جا کانکشن باز کردم بستم اما بازم وقتی برنامه اجرا میشه می بینی کانکشن باز مونده
حالا اگه بشه کلا کانکشن هارو بست یا یه کاری کرد خودشون خود بخود بسته بشن
خیلی خوب میشه

مبین رنجبر
دوشنبه 16 تیر 1393, 12:28 عصر
من مودل استفادم فرق میکنه از مورفیا استفاده کردم




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/wiki/FrequentlyAskedQuestions

hassanmosavi
سه شنبه 17 تیر 1393, 08:24 صبح
با تشکر
مشکل من رفع شد علت ان بود که در بعضی مواقع کانکشن ها بسته نمی شد و با توجه به مراجعه زیاد به بانک تعداد کانکشن های باز بالا میرفت تا 2000 بعد منگو احتمالا بخاطر کم بود فضای رم دیگه کانکشن نمیداد. که خدا رو شکر بر طرف شد
..............
اما کانکشن هارو خودش نمی بست چرا که بر نامه همچنان اجرا بود و کانکشن ها هم باز می ماند
حالا شما می گین نیاز به بستن کانکشن نیست اون روش رو من بلد نیستم

cups_of_java
سه شنبه 17 تیر 1393, 15:21 عصر
همیشه باید مستندات کلاینت مورد نظرتون رو بخونید و سعی کنید همونطور که اون توصیه کرده از کانکشن ها استفاده کنید تا اینجور موارد پیش نیاد....

hassanmosavi
چهارشنبه 18 تیر 1393, 15:52 عصر
حتما
ممنون از راهنمای