Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2010, 17:16   #1
Lemon2009
Пользователь
 
Аватар для Lemon2009
 
Регистрация: 29.07.2009
Сообщений: 72
По умолчанию сервер на java

Создавал сервер (сокеты) на java.
Все работает.
Но не долго.

Запущен на FreeBSD.

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

Последний раз редактировалось Lemon2009; 23.03.2010 в 17:16. Причина: ошибки
Lemon2009 вне форума Ответить с цитированием
Старый 24.03.2010, 00:04   #2
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Lemon2009 Посмотреть сообщение
Создавал сервер (сокеты) на java.
Все работает.
Но не долго.

Запущен на FreeBSD.

Проблема в том, что программа через некоторое время после запуска подключает клиенты, но не отвечает.
И размер используемой памяти постоянно растет (хоть и пробовал не раз оптимизировать код)
99% что программа уходит за пределы разрешенной памяти, и мусорщик пытается очистить ресурсы, тем самым блокируя ее действие.
ищите места где происходит утечка.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 26.03.2010, 18:27   #3
Lemon2009
Пользователь
 
Аватар для Lemon2009
 
Регистрация: 29.07.2009
Сообщений: 72
По умолчанию

я вот такой код сделал:

Код:
public synchronized ResultSet query(String sql) throws SQLException {
        return conn.createStatement().executeQuery(sql);
    }

    public synchronized int queryUpdate(String sql) throws SQLException {
        return conn.createStatement().executeUpdate(sql);
    }
при каждом обращение к базе обращаюсь по ним (query, queryUpdate).

Это нормально? или стоит создать только один statement и с него только обращаться?

мож это и есть утечка.
Совершенство в простоте
Lemon2009 вне форума Ответить с цитированием
Старый 26.03.2010, 18:33   #4
Lemon2009
Пользователь
 
Аватар для Lemon2009
 
Регистрация: 29.07.2009
Сообщений: 72
По умолчанию

еще вот такой:

Код:
public synchronized int addMessage(String UIN, String message) {        
        try {
            UIN = Utils.escapeString(UIN);
            message = Utils.escapeString(message);
            ResultSet result = query("SELECT `uin` FROM `cms_bot_bots` WHERE `online`=1");
            int i = 0;
            while (result.next()) {
                conn.createStatement().executeUpdate("INSERT INTO `cms_bot_msg` ( `id` , `uin` , `msg` , `time` , `bot` , `read` ) VALUES ('"+Long.toString(System.currentTimeMillis() + (long)i)+"', '"+UIN+"', '"+message+"', '"+Utils.getUnixTimeString()+"', '"+result.getString("uin")+"', '0')");
                i++;
            }
            result.close();
            return conn.createStatement().executeUpdate("INSERT INTO `cms_cli_msg` ( `port` , `time` , `unix_time` , `user` , `msg` ) VALUES ('"+SERVER_PORT+"', '0000-00-00 00:00:00', '"+Utils.getUnixTimeString()+"', '"+UIN+"', '"+message+"')");
        } catch (SQLException ex) {
            Log.addToErrorLog(ex);
            return 0;
        }
    }
Совершенство в простоте
Lemon2009 вне форума Ответить с цитированием
Старый 26.03.2010, 18:47   #5
Lemon2009
Пользователь
 
Аватар для Lemon2009
 
Регистрация: 29.07.2009
Сообщений: 72
По умолчанию

и еще вопрос. правильно ли использовать внутри цикла исключения, не тормозят ли они.

Код:
public void run() {
        try {
            while(true) {
                ResultSet r = query("SELECT * FROM `cms_bot_users` WHERE `chat`=0");
                while(r.next()) {

                }
                Thread.sleep(10);
            }
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
мож какой то другой проавильный вариант есть?
Совершенство в простоте
Lemon2009 вне форума Ответить с цитированием
Старый 27.03.2010, 10:19   #6
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

бегло осмотрел, ничего критического при этом не обнаружил.
Однако, зачем использовать для бота базу данных? чем обычные коллекции и стеки не устраивают?
Возможно я не знаю всех ваших причин, но тем не менее я считаю что это очень плохое архитектурное решение.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 27.03.2010, 19:30   #7
Lemon2009
Пользователь
 
Аватар для Lemon2009
 
Регистрация: 29.07.2009
Сообщений: 72
По умолчанию

я сделал клиент под icq-чат. если я понятно выразился ))
чтобы без icq в чате общаться. уже под готовый проект, который на базе
Совершенство в простоте
Lemon2009 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
видео-сервер Java Tasyaaa Помощь студентам 0 06.01.2010 11:49
Помогите справиться с java.lang.OutOfMemoryError: Java heap space Levilaulada Помощь студентам 1 17.05.2009 10:59
Сервер JAVA Sobstvennaya Общие вопросы по Java, Java SE, Kotlin 0 02.01.2009 02:36