Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Коннекты к базам |
Автор: Bulat 6.7.2006, 11:52 |
Вообщем работаю с несколькими базами, где разные данные соответственно. Все коннекты держу в одном классе. Соответственно если нужны вызываю сам класс и методы. По коду программы приходиться коннектиться к нескольким базам одновременно, причем есть коды в таком виде что сначала получаю данные из одной базы, и в зависимости от того, что получил коннектюсь либо ко второй, либо к третьей и т.п. и все в одном методе класса. Тока допустим если у меня нет соединения с одной из баз программа сразу же выкидывает исключительную ситуацию, но возможно мне это база в данный момент не нужна, а сдругой работать не получается. Вот как бы это грамотно организовать, чтоб если даже один сервак(база) ляжет, без ущерба можно было работать с другими? |
Автор: mulya 6.7.2006, 12:15 |
Я может вопроса не понял, а может ты его так путанно задал... короче я не вижу тут сложности, ну отвалилась база и чего? просто лови эксепшн и обрабатывай его правильно или вообще не обрабатывай, а работай себе дальше с тем что есть. |
Автор: Bulat 6.7.2006, 12:19 |
mulya, можно конечно для каждого отдельно отлавливать эксепшн, но это сколько раз код дублировать придется? ![]() А не обрабатывать, нет уж надо контролировать. Кроме того я заранее не знаю какая база мне понадобится => в метод нужно передовать все коннекты, а если сервак лег, то Connection con, вот этот самый con как null не передаст, а будет ругатся и я не смогу работать с остальными базами. |
Автор: carper 6.7.2006, 12:40 |
Bulat Ничего не понял, ну есть коннекты, обращаться за ними надо не напрямую, а через, например, get метод, который может проверить жив ли еще/имеется коннект, при необходимости попытаться его, например, восстановить и вернуть на выбор: готовый коннект/код ошибки/сгенерированное исключение. И в загадочный метод передаем не все коннекты (на фиига они все вообще сдались), а пусть наш метод вызовет нужный ему коннект через соотв. фактори метод класса, ответственного за пул коннектов. |
Автор: carper 6.7.2006, 17:42 |
Bulat "Даже если я заранее не знаю какой именно мне нужен будет? А вот про енто можно поподробнее или вообще как в кодах будет выглядеть?" Беда в том, что я никак не могу понять суть проблемы. ![]() Ну обратились мы за произвольным коннектом к фабрике коннектов, ну не "Шмогла она" выдать желаемое, в чем здесь проблема? Наш класс получит соотв. код возврата или, что разумнее, исключение, обработает его и сам решит может он жить без этого коннекта или нет, например, не попытаться ли ему обратиться к другой базе (впрочем, такой алгоритм - "поиск доступной базы", лучше возложить на фабрику соединений). ![]() Поскольку не думаю, что проблема настолько проста, то полезно было бы глянуть на кастрированный код класса, который вызывает проблему (только обязательно кастрированный много строк не имеющих отношения к делу не осилю ![]() |
Автор: chief39 6.7.2006, 19:15 |
Опиши реальную ситуацию. А то "с одной базой поработал - в зависимости от результатов то ко второй то к третьей коннектиться, если не законектился - то она мне и не нужна, а нужна другая.." "Песца на снегу не видно. Белый песец, белый снег — писец, ничего не понятно."(с) Ты на пальцах покажи, конец дня всё-таки.... не железные же ![]() Покажи - там сконнетился- считал то, в той базе хранится то, в это - не то. тут вообще нихрена не хранится, а этой базы ваще нет Хоть по именам их обзови ![]() |
Автор: Bulat 7.7.2006, 07:53 | ||||||
ОК, тока енто все равно не раскроет все моменты, потому что комбинаций коннектов много, в базе хранится куча всего, запросы очень разные. А база составлена так, что в одной первоначальная инфа по всем. В другой уже по некоторым определенным клиентам одного рода(таких несколько), в третьей по другим параметрам одни клиенты, везде данные разные. (Но логически база составлена грамотно, просто так тоже не обьяснишь, либо ряд постов и на это тратить придется) вот класс где коннекты:
Вот как я его применяю
Вот один из тех классов где мне нужны коннекты.
Как видно один коннект мне стабильно нужен, но остальные по мере необходимости, в зависимости от того какой клиент(группа клиентов) и какая инфа о нем нужна. (хотелось бы чтобы приложение все же выполняло не определенные задачи, а в определенной мере было универсальным, сорри за тавтологию) Единственное возможно лучшее решение, это как я раньше уже писал, не передовать сразу все коннекты, а вызывать их по мере необходимости и в этот момент проверять/обрабатывать. Увеличит объем кода, но пока я только так вижу оптимальный выход из ситуации. chief39, я обычно сюда по утрам, в обед лазию. Потому как понял что вечером здесь от меня мало толку. |
Автор: carper 7.7.2006, 08:48 | ||||||
Вполне нормальное решение, объем кода это никак не увеличит, разве что вместо обращения к переменной класса будет обращение к методу, ну, и в конце всех if-ов добавиться маленький блочок обработки универсального исключения (см. ниже). Код можно подсократить, обрабатывая все основные исключения в классе коннектов, который будет, в свою очередь отбрасывать только одно, собственное, исключение с подробным описанием ошибки. IMHO составление списка готовых коннектов "про запас" в данном случае не нужно.
|
Автор: Bulat 7.7.2006, 09:17 | ||
carper, ну в принципе мой алгоритм, тока в деталях немного другой ![]()
Вот за это пасиба, хоть мне это не совсем подходит(там есть еще и другие заморочки), но можно кое куда впихнуть ![]() |
Автор: chief39 7.7.2006, 14:27 |
А почему бы не сделать классец, который будет содержать в себе: - полученные коннекты - методы их инита - методы клоза То есть доработать класс Connect И создавая его - ничего не получать из пула. Передавать его вместо списка коннектов. И получать из него через GetConnection(String ID) коннекшн конкретного типа. то есть в момент вызова этого метода - получать коннекшн если он ещё не получен, сохранять его в переменной(хэшмэпе ссылок на коннекшны по имени) класса и выделять наверх, уже для использования. Там(в классе) и делать обработку всех иксепшнов. И сделать close() в этом классе, который будет закрывать все открытые до того коннекшны. Кстати, такой клоз или такие клозы стоит заносить в finally блок, а не оставлять просто в конце метода |
Автор: kondr 13.7.2006, 14:39 |
Я вообще в Java не большой спец, но здесь по-моему явно плохой дизайн и из-за этого все проблемы. У тебя три класса инита, три класса дестроя с одинаковым кодом и т.п. Почему бы их не вынести в базовый класс? Короче надо сделать базовый класс конекта и три потомка для соединения с каждой базой. |
Автор: Bulat 20.7.2006, 07:41 |
kondr, такая реализация не решает суть самой проблемы ![]() |
Автор: chief39 20.7.2006, 10:39 | ||
А какая разница для реализации? ![]() УРЛЫ коннектов всё равно разные в этих двух случаев у разных БД. С программной т.з. - джидибиси пофик тут же база или на дргуом серваке |
Автор: Bulat 20.7.2006, 11:24 |
Тема пока себя изжила, конкретно для меня, у меня пока поставились другие задачи, может скоро вернусь. Да и кроме того я наконец добрался до hibernate ![]() |