Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Архитектурное решение 
:(
    Опции темы
cupper
Дата 10.9.2012, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Представьте что у вас есть базовый абстрактный класс Database. Есть подклассы Mysql, Oracle, .... Есть фабрика котор умнеет создавать конечные экземпляры, т.е. Mysql, Oracle.
Есть такое понятие как uri_list, для случая распределенной БД. 

Вопрос, кто должен отвечать за перебор этих самых uri_list в случае реконекта ?
Первый способ:
Код

some_function()
{
    size_t uri_count = 0;
    Database db(DBFactory::create(++uri_count % GetUriList().size()));
    while(true)
    {
        try{
            log("Connecting");
            db->connect();
            log("Connected");
            
            // infinity loop
            while(do_something());
        }
        catch(SqlException){
            log("Disconnected");
            db.disconnect()
            db.reset(DBFactory::create(++uri_count % GetUriList().size()))
            sleep(reconnect_timeout);
            continue;
        }
        catch(){exit(1)};
    }
    
}

Тут все тривиально, сразу видна логика работа с БД. Конечный экземпляр Database, будь то Mysql или Oracle, знать не знает о том, что у нас может быть несколько БД, незнает о том что нужно делать паузы между реконнектами и тому подобное. Database это примитив который умеет только самое необходимое.
Проблема в том что, таких функций some_function в коде может быть несколько, в разных модулях например. И в один прекрасный момент, нужно будет что то поменять в логике работы с БД. В моем случае это было добавление паузы при реконнекте 
Код

sleep(reconnect_timeout);

И как следовало ожидать, в одном месте таки забыли добавить, и вылезло это аж только через пару месяцев. Ужас короче.

Второй способ: собственно над ним я сейчас как раз и думаю. Как сделать так что бы не переусложнять примитив Database но при этом спрятать всю логику в одном месте.
Например за перключением alias'ов (uri_list) может отвечать фабрика DBFactory. Пихать это в конечную реализацию Mysql не кошерно потому что придется дублировать в других классах типа Oracle.

А еще нужно спрятать логирование, паузу при реконнекте, да и сам процесс реконнекта завуалировать под одну операцию а не 
Код

log("Disconnected");
db.disconnect()
db.reset(DBFactory::create(++uri_count % GetUriList().size()))
sleep(reconnect_timeout);
....
log("Connecting");
db.connect()
log("Connected");


PS. почему в топике про С++... не нашел более подходящего, а язык реализации как раз С++
PM MAIL   Вверх
bsa
Дата 10.9.2012, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Посмотри, как это сделано у "конкурентов": http://soci.sourceforge.net/
PM   Вверх
xvr
Дата 11.9.2012, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Сделайте proxy между Database и его клиентами. И пусть этот proxy и обрабатывает реконекты (внутри запроса от клиента)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1149 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.