Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392

Начинает медленно работать Java программа

30.09.2013, 14:12. Показов 5050. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот смотрите пишу программу по SMPP. Главный поток выдерает из базы 150смс и начинает их рассылать путем создания ExecutorService. Потом главный поток завершения всех подпотоков, путем вызова get(). Подпотоки отправляют и делают запись в базу.

Так вот. Сначало все нормально СМС идут как положено по 100-150 в секунду, НО вот через некоторое время программа перестает их отправлять с такой скоростью и шлет по 1-2смс/с

Уважаемые форумчане подскажите из за чего такое может случаться ?

Массив в который результаты подпотоков складываю, очищаю в конце ожидания завершения подпотоков
Подпотоки Runnable
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.09.2013, 14:12
Ответы с готовыми решениями:

Компьютер начинает медленно работать в игре.
Созрел вопрос. На днях заметил, что когда я играю в одну компьютерную игрушку (Empire total war) стал тупить комп (дёргаться изображение то...

Программа начинает неправильно работать после открытия её в Delphi XE8
Подскажите пожалуйста, почему программа созданная в Borland Delphi 7, которая работает правильно после открытия её в Delphi XE8 начинает не...

Win2000 Advanced Server: при загрузке начинает вешаться, медленно работает
Стоит Win2000 Advanced Server. Симптом: при загрузке начинает вешаться, медленно работает, на нажития мышек/кнопок реагирует с одно-,...

38
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
01.10.2013, 20:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Critically Посмотреть сообщение
Программа то работает просто начинает тормозить и не понятно почему
На 99% процентов - проблема в вашем коде, который исполняется в разных потоках, особенно - работа с БД.
Я так и не понял: почему нельзя обновлять БД в одном потоке, уже после отправки сообщений?
1
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
01.10.2013, 22:37  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
На 99% процентов - проблема в вашем коде, который исполняется в разных потоках, особенно - работа с БД.
Я так и не понял: почему нельзя обновлять БД в одном потоке, уже после отправки сообщений?
Понятно что в коде, я вот и пытаюсь разобраться, всю голову уже сломал...

Дело в том что при отправке смс-ки я получаю некий messageId от СМС центра и сразу записываю его в БД... Вот только раньше я эти штуки хранил в хэштаблице и послетого как весь пул отработает, я ее перебирал в главном потоке ну и запиливал все id в базу... Вот только проблема была такая же... сначало все быстро было, потом начинало тормозить...
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
02.10.2013, 07:26
А вы commit делаете после записи в идентификаторов в БД?
Или у вас авто-коммит на соединении?
1
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
03.10.2013, 08:55  [ТС]
Я к сожалению не знаю что это такое ((

Добавлено через 14 минут
Почитал про commit, не использую автокоммит, да и просто коммит тоже...

Добавлено через 3 часа 34 минуты
Да вот еще что, мне нужно использовать пул потоков, потому что один поток не может отправить 150смс секунду... Поэтому отправляю каждую в отдельном потоке.

Добавлено через 12 часов 58 минут
Все что ли, варианты закончились ?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
03.10.2013, 09:17
Сделайте так, чтобы ваш SenderThread возвращал значение:
Java
1
public class SenderThread implements Callable<SenderResult> {
В класс SenderResult записывайте все поля, которые должны записываться в БД (id, messageId, sms_send_id, idfull).

В главном классе перед циклом вызова Future.get() сделайте следующее:
Java
1
MainForm.connection.setAutoCommit(false);
При вызове Future.get() - вы получите объект SenderResult. Дальше с помощью ваших PreparedStatement-ов делаете batch insert/update.
После цикла вызываете executeBatch() и делаете commit на connection.
1
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
03.10.2013, 10:57  [ТС]
Спасибо, буду пробовать, отпишу по результату...

Добавлено через 38 минут
Вопрос такой, как думаете Кортежем можно воспользоваться ? Оптимально будет ?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
03.10.2013, 13:21
В java нет кортежей. Что вы имеете в виду?
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
03.10.2013, 14:33
Цитата Сообщение от turbanoff Посмотреть сообщение
В java нет кортежей. Что вы имеете в виду?
мне чёт кажется что ТС всё делает на jython и пытается юзать в нем java классы в стиле python-a)
0
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
03.10.2013, 16:13  [ТС]
Ну может не так выразился. Обычный класс для хранения нескольких значений. Мне же нужно не одно значение вернуть а несколько...

Добавлено через 35 минут
Хотя нет, у меня же все результаты строковые, поэтому попробую массив строк выводить в результат...

Добавлено через 21 минуту
Ну вроде бы переделал как вы и говорили: Это побочные потоки которые стали Callable
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package sms;
 
import java.io.IOException;
import java.util.concurrent.Callable;
 
import org.jsmpp.InvalidResponseException;
import org.jsmpp.PDUException;
import org.jsmpp.bean.Alphabet;
import org.jsmpp.bean.DataCoding;
import org.jsmpp.bean.ESMClass;
import org.jsmpp.bean.MessageClass;
import org.jsmpp.bean.NumberingPlanIndicator;
import org.jsmpp.bean.RegisteredDelivery;
import org.jsmpp.bean.SMSCDeliveryReceipt;
import org.jsmpp.bean.TypeOfNumber;
import org.jsmpp.extra.NegativeResponseException;
import org.jsmpp.extra.ResponseTimeoutException;
import org.jsmpp.session.SMPPSession;
 
 
public class SenderThread implements Callable<String[]> {
 
    private int j;
    public  String id;
    private byte[][] byteMessagesArray;
    private String sourceMsisdn;
    private String destinationMsisdn;
    private MessageClass messageClass;
    private Alphabet alphabet;
    private ESMClass esmClass;
    private Integer z;
    private String sms_send_id;
    private String idfull;
 
public SenderThread(int j, byte[][] byteMessagesArray, String id, String idfull, String sms_send_id, String sourceMsisdn, String destinationMsisdn,MessageClass messageClass,
            Alphabet alphabet,ESMClass esmClass,Integer z) {
        this.j = j;
        this.id = id;
        this.byteMessagesArray = byteMessagesArray;
        this.sourceMsisdn = sourceMsisdn;
        this.destinationMsisdn = destinationMsisdn;
        this.messageClass = messageClass;
        this.alphabet = alphabet; 
        this.esmClass = esmClass;
        this.z = z;
        this.sms_send_id=sms_send_id;
        this.idfull=idfull;
    }
private String submitMessageLong(SMPPSession session, byte[] message,String sourceMsisdn, String destinationMsisdn,MessageClass messageClass, Alphabet alphabet, ESMClass esmClass, Integer z) {
        String messageId = null;
        try { //Alphanumeric,ISDN,,INTERNATIONAL,ISDN
            messageId = session.submitShortMessage("", TypeOfNumber.ALPHANUMERIC, NumberingPlanIndicator.ISDN, sourceMsisdn,TypeOfNumber.INTERNATIONAL, NumberingPlanIndicator.ISDN, destinationMsisdn, esmClass, (byte) 0, (byte) 1, null, null, new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE), (byte) 0, DataCoding.newInstance(z), (byte) 0, message);
        } catch (PDUException e) {
            System.err.println("Invalid PDU parameter");
        } catch (ResponseTimeoutException e) {
            System.err.println("Response timeout");
        } catch (InvalidResponseException e) {
            System.err.println("Receive invalid respose");
        } catch (NegativeResponseException e) {
            System.err.println("Receive negative response");
        } catch (IOException e) {
            System.err.println("IO error occur");
        }
        return messageId;
    }
    
@Override
public String[] call() throws Exception {
    String messageId;
    try {
        //Получаем messageId
        messageId = submitMessageLong(MainForm.gatewayTX_Devino.getSession(), byteMessagesArray[j], sourceMsisdn, destinationMsisdn, messageClass, alphabet, esmClass, z);
        if(messageId==null){                                                        
            MainForm.ta.append("NULL -"+destinationMsisdn+"\n");
        }else {
            MainForm.ta.append("Message submitted, message_id is " + messageId +" "+id+"\n");
            String [] allStrings = new String[4];
            allStrings[0] = id;
            allStrings[1] = messageId;
            allStrings[2] = sms_send_id;
            allStrings[3] = idfull;
            
            return allStrings;
            /*//Инсертим в smpp_stats_long записть с messageID
            MainForm.stmtInsert.setString(1, id);
            MainForm.stmtInsert.setString(2, messageId);
            MainForm.stmtInsert.setString(3, "");
            MainForm.stmtInsert.setString(4, sms_send_id);
            //Апдейтим smpp, что СМС отправилась
            MainForm.stmtUpdate.setString(1, idfull);
            MainForm.stmtInsert.executeUpdate();
            MainForm.stmtUpdate.executeUpdate();
            MainForm.ta.append("Message submitted, message_id is " + messageId +" "+id+"\n");*/
        }
    } catch (IOException e1) {} 
    return null;
}
}


Главный поток:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
                        for (int j = 0; j < byteMessagesArray.length; j++) {
                            id="";
                            idfull="";
                            id=ids+'-'+j;
                            idfull=ids;
                            Future<String[]> future = execService.submit(new SenderThread (j, byteMessagesArray, id, idfull, sms_send_id, sourceMsisdn, destinationMsisdn, messageClass, alphabet, esmClass, z));
                            list.add(future);
                       }
 
                      }//end while
                } catch (SQLException e) {
                       MainForm.ConnectToMySQL();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally{
                    try {
                         MainForm.connection.setAutoCommit(false);                       
                         for (Future<String[]> f : list)
                          {
                             try {
                                 String[] result = f.get();
                                    MainForm.stmtInsert.setString(1, result[0]);
                                    MainForm.stmtInsert.setString(2, result[1]);
                                    MainForm.stmtInsert.setString(3, "");
                                    MainForm.stmtInsert.setString(4, result[2]);
                                    MainForm.stmtUpdate.setString(1, result[3]);
                                    MainForm.stmtInsert.addBatch();
                                    MainForm.stmtUpdate.addBatch();                             
                                } catch (InterruptedException | ExecutionException e) {
                                e.printStackTrace();
                            }
                          }
                          MainForm.stmtInsert.executeBatch();
                          MainForm.stmtUpdate.executeBatch();
                          MainForm.connection.commit();
                        list.clear();
                        rs.close();
                        stmt3.close();
                    } catch (SQLException e) {} 
 
                }
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
03.10.2013, 16:24
Вроде все верно. Отпишитесь как проверите.
0
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
03.10.2013, 16:39  [ТС]
Да вот проверил, опять такая же фигня но уже 900 отправил нормально, были конечно задержки в 3сек но я думаю это просто из за системы, хотя i5 4ядра... Щас написал в тех.поддержку, может на стороне провайдера ограничения какие стоят... Так как после того как отправилось коннект с СМСцентром рвется...

Добавлено через 8 минут
Еще такой вопрос когда смс на отправку нет в базе то главный поток проходит по этим штука
Java
1
2
3
4
5
6
7
   
                          MainForm.stmtInsert.executeBatch();
                          MainForm.stmtUpdate.executeBatch();
                          MainForm.connection.commit();
                        list.clear();
                        rs.close();
                        stmt3.close();
Последние 3 то вроде ничего, а вот первые 3 ? Они никаких ошибок не будут вываливать ? Ну тоесть он же пытается что то Екзекутить, и коммитить
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
03.10.2013, 17:37
Нет, не должны.
1
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
07.10.2013, 11:46  [ТС]
Все перепроверил. Такая же фигня, сначало быстро отправляются, потом медленно, потом опять быстро штук 100-300, потом опять медленно... Из за чего такое может быть ?

Добавлено через 3 минуты
Тоесть, я так полагаю, это работает так, сначала Executor быстро выполняет все свои 100 потоков, а потом почему то начинает выполнять 1 поток в секунду и как только он выполнит за 100 сек свои потоки потом опять быстро 100 штук выполнят, вообще не понятно почему так. Если надо я код предоставлю, вы только скажите. Я уже замучился с этой проблемой, месяц сижу.

Добавлено через 5 минут
Знаете еще что у меня ведь еще 2 программы сидят на этой MySQL базе и теперь стала вываливаться ошибка в другой программе: "Lock wait timeout exceeded; try restarting transaction". Может тормозит из за большого количества запросов в базу ?
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
07.10.2013, 11:50
попробуйте покрыть всё логами, вплоть до элементарных вызовов и коннектов, потом правда придется провести археологические раскопки, но вдруг поймете что именно причина

Добавлено через 2 минуты
Цитата Сообщение от Critically Посмотреть сообщение
Добавлено через 5 минут
Знаете еще что у меня ведь еще 2 программы сидят на этой MySQL базе и теперь стала вываливаться ошибка в другой программе: "Lock wait timeout exceeded; try restarting transaction". Может тормозит из за большого количества запросов в базу ?
а случаем SQL не на одном пк с программами стоит?
0
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
07.10.2013, 11:51  [ТС]
Кстати вот еще что, база формата MyISAM

Добавлено через 48 секунд
Да на одном ПК, все три программы и MySQL, мы просто думали что так быстрее транзакции будут проходить, чем через локаль.
0
ɐwʎ ɔ vǝmоɔ dиw ɐʚонɔ
 Аватар для tankomaz
443 / 442 / 100
Регистрация: 14.10.2012
Сообщений: 1,146
Записей в блоге: 9
07.10.2013, 11:54
Цитата Сообщение от Critically Посмотреть сообщение
Кстати вот еще что, база формата MyISAM

Добавлено через 48 секунд
Да на одном ПК, все три программы и MySQL, мы просто думали что так быстрее транзакции будут проходить, чем через локаль.
Однако при модификации и добавлении записей вся таблица кратковременно блокируется, это может привести к серьёзным задержкам при большой загрузке.
http://ru.wikipedia.org/wiki/MyISAM

может проблема именно в этом

Добавлено через 45 секунд
Цитата Сообщение от Critically Посмотреть сообщение
Да на одном ПК, все три программы и MySQL, мы просто думали что так быстрее транзакции будут проходить, чем через локаль.
попробуйте разнести, хотя бы для теста (если это возможно)
0
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
07.10.2013, 14:00  [ТС]
Но я ту программу которая выдает такую ошибку, запускал через дебаггер на другой машине, ну что бы посмотреть в чем ошибка и вот как раз увидел эту штуку: "Lock wait timeout exceeded; try restarting transaction"

Добавлено через 2 минуты
MyISAM взяли потому что ключ сохраняется... в InnoDB если например вырубят свет или ребут компа, то ключ слетает и отсчет начинается с нуля...

Добавлено через 2 часа 3 минуты
Хмм помогло, удаление из программы Ресивера. который статусы получает. Теперь скорость отличная. Только вот не понятно, как ресивер мешал трансмиттеру. Он же в отдельном потоке работает.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
07.10.2013, 18:00
Цитата Сообщение от Critically Посмотреть сообщение
Только вот не понятно, как ресивер мешал трансмиттеру. Он же в отдельном потоке работает.
Код в студию!
0
10 / 10 / 6
Регистрация: 14.03.2011
Сообщений: 392
07.10.2013, 18:56  [ТС]
Завтра на работе буду, обязательно напишу... Очень хочу добить эту тему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.10.2013, 18:56

После переустановки Windows - страница при просмотре спускается очень медленно и начинает плавать
После того как я переустановил windows xp с компьютером что-то странное. Когда я просматриваю страницу в интернете и пытаюсь спуститься...

после установки любого драйвера для видеокарты, монитор начинает мигать, изображения загружаются медленно
Здравствуйте!больше не знаю что делать, подскажите) снес винду, отформатировал жесткий, всё нормально, но после установки любого драйвера...

Какой браузер лучше установить вместо Opera? (после получаса работы начинает медленно открывать вкладки)
Здравствуйте! Посоветуйте пожалуйста, какой лучше браузер на сегодняшней день лучший? Ребят, стоит опера, но после получаса работы начал...

Unity начинает медленно отрисовывать падение персонажа (Как бы проседает FPS, но только на падение)
Собственного говоря, всем здравствуйте! Я в юнити работаю очень редко, но всегда хотелось (как, думаю, и многим) написать собственную...

Поток не начинает работать
Здравствуйте, столкнулся с очень необычной штукой, по крайней мере для меня. Созданные потоки и он просто не начинает работать. Даже не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru