Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> структура сервера 
V
    Опции темы
skhilkov
Дата 20.12.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нужно написать многопоточный сервер, который будет работать с базой данных. Делаю это  первый раз, поэтому возник такой вопрос:
   Как лучше организовать работу с БД? То есть можно сделать так, чтобы каждый поток рабтал с БД отдельно, то есть создавал бы свой отдельный коннект. А можно всю работу с БД повесить на отдельный класс, ссылка на единственный экземпляр которого будет передаваться каждому созданному потоку(тогда как я понимаю будет нужна синхронизация)?



--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
Bulat
Дата 20.12.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



ИМХО, но для каждого потока создавать свой коннект не правильно, как минимум потому, что будет брать очень много ресурсов. А вот создавать отдельный класс коннекта, это по-моему практикуется не только при написании многопоточных серверов. smile 

Цитата(skhilkov @  20.12.2006,  11:17 Найти цитируемый пост)
тогда как я понимаю будет нужна синхронизация

Скорее всего, но не обязательно, все зависит от того что и как ты собираешься делать smile 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
y3u
Дата 20.12.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а какие исходные условия? почему бы не взять какой-нибудь уже готовый AS и написать бизнеслогику на тех же EJB 3.0... там не будет проблем с многопоточностью + будут все документированые фишки, в частности транзакции и т.д...


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
tux
Дата 20.12.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(skhilkov @  20.12.2006,  11:17 Найти цитируемый пост)
То есть можно сделать так, чтобы каждый поток рабтал с БД отдельно, то есть создавал бы свой отдельный коннект.

Это сразу плохое решение. У тебя в результате будет огромное количество соединений, которые большую часть времени без действуют. При большой нагрузке, конечно.

Цитата(skhilkov @  20.12.2006,  11:17 Найти цитируемый пост)
А можно всю работу с БД повесить на отдельный класс, ссылка на единственный экземпляр которого будет передаваться каждому созданному потоку(тогда как я понимаю будет нужна синхронизация)?

Берем готовый пул соединений, например, DBCP или C3P0, это решит сразу многие проблемы с соединениями с БД.


PM MAIL Skype GTalk Jabber YIM   Вверх
skhilkov
Дата 20.12.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(y3u @ 20.12.2006,  12:03)
а какие исходные условия? почему бы не взять какой-нибудь уже готовый AS и написать бизнеслогику на тех же EJB 3.0... там не будет проблем с многопоточностью + будут все документированые фишки, в частности транзакции и т.д...

Разбираться долго, к тому же это не такой серьезный проект. Тут именно надо написать САМОМУ.


То есть как я понимаю все-таки делаем отдельный  класс для работы с БД, делаем нужные методы synchronized и этого достаточно?


--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
tux
Дата 20.12.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(skhilkov @  20.12.2006,  13:19 Найти цитируемый пост)
То есть как я понимаю все-таки делаем отдельный  класс для работы с БД, делаем нужные методы synchronized и этого достаточно? 

Тогда описывай как ты себе представляешь этот отдельный класс. Какие у него методы, функциональность?
PM MAIL Skype GTalk Jabber YIM   Вверх
skhilkov
Дата 20.12.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(tux @ 20.12.2006,  13:25)
Тогда описывай как ты себе представляешь этот отдельный класс. Какие у него методы, функциональность?

Вот такой класс:
Код

public class DatabaseManager
{
    String _host = "";
    String _userName = "";
    String _userPass = "";
    String _dbName = "";
    Connection _connection = null;
    
    public DatabaseManager(String host, String user, String pass, String dbName) throws SQLException, ClassNotFoundException
    {
        _host = host;
        _userName = user;
        _userPass = pass;
        _dbName = dbName;
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            _connection = DriverManager.getConnection("jdbc:mysql:"+_host+"//"+_dbName, _userName, _userPass);
        }
        catch (SQLException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (ClassNotFoundException e) 
        {
            System.err.println("Can't instantiate mysql driver!");
        }
    }
    
    public synchronized boolean registerUser()
    {
        //TODO: Внести в таблицу информацию о пользователе
        return false;
    }
    
    public synchronized void updateUserInfo()
    {
        //TODO: Изменить информацию о пользователе
    }
    
    public synchronized UserInfo getUserInfo()
    {
        //TODO: Вернуть информацию о пользователе
        return null;
    }
    
}


Создать экземпляр этого класса и раздавать его всем потокам при создании.


--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
tux
Дата 20.12.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



В общем я и предполагал, что будет одно соединение на всех. Значит так. Если это какое-то учебное приложение, которое никогда в реальной жизни использоваться не будет, то прокатит и так. Под нагрузкой у тебя здесь это единственное соединение с базой данных станет узким местом, тормозящим работу всего приложения. Если будет реальная эксплуатация, то нужен пул соединений. При необходимости могу очень простую реализацию подкинуть.
PM MAIL Skype GTalk Jabber YIM   Вверх
skhilkov
Дата 20.12.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tux, 
Я думаю что в моем случае так прокатит. Еще вопрос - правильно ли то, что я делал методы для работы с БД синхронизированными? И надо ли делать взаимное оповещение потоков(wait(), notify())? 


--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
tux
Дата 20.12.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

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



Цитата(skhilkov @  20.12.2006,  14:28 Найти цитируемый пост)
Еще вопрос - правильно ли то, что я делал методы для работы с БД синхронизированными?

Думаю да. Хотя как скажется на соединении с базой данных работа в многопоточной среде с точностью сказать не смогу. Скорее всего отрицательно. Учитывай, что у тебя каждый метод должен быть полноценной транзакией - завершаться фиксацией или откатом и закрывать все созданные ресурсы за исключением самого соединения.
PM MAIL Skype GTalk Jabber YIM   Вверх
skhilkov
Дата 20.12.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tux, 
спасибо большое!


--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

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


 




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


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

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