Лучшая практика управления соединениями с базой данных в веб-приложении - PullRequest
3 голосов
/ 23 ноября 2011

Я занимаюсь разработкой приложения MongoDB на Java, но думаю, что этот вопрос связан с соединениями хранилища данных для веб-приложений в целом.

Мне нравится структурировать все веб-приложения с четырьмя пакетами верхнего уровня, которые называются (что, я думаю, самоочевидно):

  • Контроллер
  • Модель
  • ДАО
  • Util

В идеале я хотел бы иметь класс в пакете Dao, который обрабатывает все детали соединений.

Пока что я создал класс, который выглядит следующим образом:

public class Dao {

public static Mongo mongo;
public static DB database;

public static DB getDB() throws UnknownHostException, MongoException{
    mongo = new Mongo("localhost");
    database = mongo.getDB("mydb");
    return database;
    }

public static void closeMongo(){
    mongo.close();
    } 
}

Я использую его в своем коде с чем-то вроде этого

public static void someMethod(String someData){
    try {
        DB db = Dao.getDB();
        DBCollection rColl = db.getCollection("mycollection");      
        // perform some database operations
        Dao.closeMongo();

    } catch (UnknownHostException e) { e.printStackTrace(); } catch (MongoException e) { e.printStackTrace(); 
    }
}

Кажется, это работает нормально, но мне было бы любопытно узнать, что люди считают "лучшим" способом решения этой проблемы, если такая вещь существует.

Ответы [ 4 ]

1 голос
/ 24 ноября 2011

Я получил «хорошее» решение из этой статьи. http://www.lennartkoopmann.net/post/722935345

Редактировать Поскольку эта ссылка мертва, вот одна из waybackmachine.org

http://web.archive.org/web/20120810083748/http://www.lennartkoopmann.net/post/722935345

Основная идея

Что мне показалось интересным, так это использование статического синхронизированного метода, который возвращает экземпляр статического класса и его переменные. Большинство профессиональных разработчиков, вероятно, считают это очевидным. Я обнаружил, что это полезный шаблон для управления соединениями БД.

1020 * Pooling *

Mongo выполняет автоматический пул соединений, поэтому ключом является использование только одного соединения с хранилищем данных и предоставление ему возможности управлять своим собственным пулом.

1 голос
/ 23 ноября 2011

Основное правило при подключении к серверу реляционной базы данных - наличие пула. Например, если вы подключаетесь к базе данных Oracle с помощью пула, вы получаете некоторые преимущества в производительности как с точки зрения времени установки соединения, так и времени синтаксического анализа (если вы используете переменные связывания). Другие реляционные базы данных могут отличаться, но я считаю, что пул - это хороший шаблон даже по какой-то другой причине (например, вы можете захотеть ограничить максимальное количество соединений с вашим пользователем БД). Вы используете MongoDB, поэтому первое, что нужно проверить, это то, как MongoDB обрабатывает соединения, как экспансивно создает соединение и т. Д. Я предлагаю использовать / построить класс, который может реализовать логику пула, потому что он дает вам гибкость, которая может вам понадобиться в будущем. Глядя на ваш код, кажется, что вы API

DB db=Dao.getDB();

должно быть в паре с:

Dao.closeDB(DB db);

Таким образом, у вас есть возможность действительно закрыть соединение или использовать его повторно, не затрагивая код Дао. с помощью этих двух методов можно переключать способы управления соединениями без перекодирования объектов Dao

1 голос
/ 23 ноября 2011

Я бы посоветовал вам написать класс Java для установления соединения с базой данных.

Аргументами метода должны быть database name, password, host port и другие необходимые учетные данные.

Вы всегда можете вызвать параметризованный конструктор везде, где необходимо установить соединение с базой данных. Это может быть модель.

0 голосов
/ 23 ноября 2011

Я думаю, что лучше вызывать метод внутри DAO для получения данных из базы данных.Если вы делаете это таким образом, скажем, ваша база данных изменилась.Затем вам придется редактировать много классов, если вы получаете данные, напрямую вызывающие запросы к БД.Поэтому, если вы разделяете вызывающие методы db внутри самого класса DAO и вызываете этот метод для получения данных, это лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...