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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создается много процессов postgres 
:(
    Опции темы
implements
Дата 29.7.2010, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть класс отвечающий за работу с БД, реализован он как singleton, в приватном конструкторе создаю подключение к БД, и в методах реализована логика(всякие селекты и insert-ы), и вот ложу все это дело на веб-сервер tomcat и начинаю вызывать методы, и с каждым вызовом появляется в процессах новый просесс postgres, и ка вы поняли через время это все дело валится

Код

    public class DataBase { 
    private static DataBase Instance; 
    private static Connection con; 
    private Statement statement; 
    private String sqlcommand; 
    public static DataBase getInstance(){ 
    if(Instance==null) 
    Instance=new DataBase(); 
    return Instance; 
    } 
    private DataBase (){ 
    connectBase(); 
    } 
    public void connectBase() { 
    String username = "postgres"; 
    String password = "123456"; 
    String url = "jdbc:postgresql://localhost:5432/db"; 
    try { 
    Class.forName("org.postgresql.Driver"); 
    con = java.sql.DriverManager.getConnection(url, username, password); 
    statement = con.createStatement(); 
    } catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
    } catch (SQLException e) { 
    e.printStackTrace(); 
    } 
    } 
      
    public String PutFTPFromBase() 
                throws Exception { 
    sqlcommand = "select * from table"; 
    try { 
    res = statement.executeQuery(sqlcommand); 
    } 
    res.close(); 
    } catch (SQLException e) { 
    e.printStackTrace(); 
    } 
    } 
      
      
    }


Это сообщение отредактировал(а) implements - 29.7.2010, 07:58
PM MAIL   Вверх
witex
Дата 29.7.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

 try { 
    res = statement.executeQuery(sqlcommand); 
    } 
    res.close(); 
    } catch (SQLException e) { 
    e.printStackTrace(); 
    } 

А как это компилируется?
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
dobrolub
Дата 29.7.2010, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



у тебе текут объекты java.sql.Connection, а создание процессов postgres – один из эффектов течи. На каждый новый connectBase() создаётся новый Connection, который не закрывается. 

Почитай tutorial по JDBC
PM   Вверх
implements
Дата 30.7.2010, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



witex,  что значит как?
dobrolub,  Дык у меня оъект DataBase существует в одном экземпляре, и в его приватном конструкторе я создаю java.sql.Connection, следовательно и он будет в одном экземпляре, правильно?

Да кстати делал по простому, каждый раз создавал java.sql.Connection и закрывал его, всеравно  процесс postgres не уничтожался.
PM MAIL   Вверх
dobrolub
Дата 30.7.2010, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



Надо добавить System.out.printlns и убедиться, что это именно так. Из кода который ты показал это не очевидно.

Это сообщение отредактировал(а) dobrolub - 30.7.2010, 07:49
PM   Вверх
implements
Дата 30.7.2010, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



dobrolub,  
Этот код не показывает?

Код

 public static DataBase getInstance(){ 
       if(Instance==null) 
           Instance=new DataBase(); 
       return Instance; 
 } 
    private DataBase (){ 
    connectBase(); 
    } 


Это сообщение отредактировал(а) implements - 30.7.2010, 07:47
PM MAIL   Вверх
dobrolub
Дата 30.7.2010, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



Class Database - public, method connectBase – public . следовательно из другого места программы может вызываться много раз.
PM   Вверх
implements
Дата 30.7.2010, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



dobrolub,  Мда а Вы знаете как я его вызываю методы этого класса?
а вот так вот
Код

DataBase.getInstance(). METHOD();

Это такой шаблон, я явно не создаю объект
Код

DataBase db=new DataBase();

За это отвечает статический метод getInstance(), это так на всякий случай если Вы не знаете!

Это сообщение отредактировал(а) implements - 30.7.2010, 07:59
PM MAIL   Вверх
dobrolub
Дата 30.7.2010, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



Ну например такой код даст Connection leak:

Код

for (int i = 0; i < 10; i++)
  DataBase.getInstance().connectBase();


Я бы добавил System.out.println  в код перед выделением Connection, чисто чтобы убедиться. Весь твой код я не смотрю же. Ты только один класс показал.
PM   Вверх
implements
Дата 30.7.2010, 10:59 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(dobrolub @  30.7.2010,  08:21 Найти цитируемый пост)
for (int i = 0; i < 10; i++)  DataBase.getInstance().connectBase();

А зачем так???? 

когда вызывается getInstance(), то он смотрит создан класс или нет, если создан, то возвращает ссылку на него, а если нет, то создает и возвращает, в этом я уверен это же ведь singleton!!!

PM MAIL   Вверх
aleksandy
Дата 30.7.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(implements @  30.7.2010,  10:59 Найти цитируемый пост)
в этом я уверен это же ведь singleton

Не будь таким уверенным... Твой код в многопоточном приложении запросто может создать несколько экземпляров connection. Читай срочно.

И statement лучше создавать и закрывать для каждого запроса заново.
PM   Вверх
implements
Дата 30.7.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(aleksandy @  30.7.2010,  12:54 Найти цитируемый пост)
Не будь таким уверенным... Твой код в многопоточном приложении запросто может создать несколько экземпляров connection

Знаю, но приложение однопоточное=), но ладно что ыло легче я синхронизирую все это дело!


Цитата(aleksandy @  30.7.2010,  12:54 Найти цитируемый пост)
И statement лучше создавать и закрывать для каждого запроса заново.

Делал и statement и connection открывал и закрывал с каждым новым обрашением, НО приэтом процессы не удалялись, при создании каждый раз новый создается!!!
PM MAIL   Вверх
implements
Дата 30.7.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Впринципе когда каждый раз закрываю и открываю connection, res и statment то работает нормально!
Но все-же класс управления БД должен быть в одном экземпляре!
PM MAIL   Вверх
dobrolub
Дата 30.7.2010, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

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



Цитата(implements @ 30.7.2010,  10:59)
Цитата(dobrolub @  30.7.2010,  08:21 Найти цитируемый пост)
for (int i = 0; i < 10; i++)  DataBase.getInstance().connectBase();

А зачем так???? 

Я хотел обратить внимание на твой метод connectBase() (не getInstance()). connectBase – public и может быть вызван из другого места программы много раз.

>Да кстати делал по простому, каждый раз создавал java.sql.Connection и закрывал его, всеравно  процесс postgres не уничтожался.
процесс будет висеть если он ещё используется драйвером, или когда он ещё в пуле процессов postgres для новых клиентов.

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

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

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


 




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


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

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