Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Долгое закрытие JDBC / 25 сообщений из 59, страница 1 из 3
22.10.2013, 16:13:01
    #38437182
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Здравствуйте. Проблема такого плана. Существует класс в котором запущен Thread который вызывает эту функцию. Объектов класса может быть несколько сотен, следовательно каждый из них может вызывать эту функцию. Очень часто соединения долго не закрываются. Такое ощущение что хранимая процедура синхронная и пока какой-то поток не выполнит ее, все остальные ждут. Из-за этого некоторые соединения весят по N секунд, хотя сама процедура выполняется по 2-5 миллисекунды. Что не так в коде? Заранее огромное спасибо!

Код: 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.
private void sendHostPreview(int hostId,Packets.ScreenPreview screenPreview){

		Connection mConnection=null;
    	CallableStatement mStatement=null;
		ResultSet mResult=null;
		
		try {
			try {
				screenPreview.host_id=hostId;
				
				mConnection = getDbConnection();
				mConnection.setAutoCommit(false);
				mStatement=mConnection.prepareCall("CALL SEND_HOST_PREVIEW(?)");
				mStatement.setInt(1, hostId);
				mResult=mStatement.executeQuery();
				mConnection.commit();
			
				while(mResult.next()){
					int userId=mResult.getInt(1);
					for (int i=0;i<Hub.SESSIONS.length-1;i++) {
						if(Hub.SESSIONS[i]!=null && Hub.SESSIONS[i].sessionType==Session.SessionType.User && Hub.SESSIONS[i].getUserId()==userId){
							Hub.SESSIONS[i].sendData(screenPreview);
						}
					}
				}
				
			} catch (SQLException e) {
				SessionHelper.logError(e, "sendHostPreview");
			}
		}
		catch(Exception e){
			SessionHelper.logError(e, "sendHostPreview");
		}
		finally{	
			try{
				if(mConnection!=null){}
				if(mStatement!=null){mStatement.close();}
				if(mResult!=null){mResult.close();}
			}
			catch(SQLException e){
				SessionHelper.logError(e, "sendHostPreview");
			}
		}
		
	}

...
Рейтинг: 0 / 0
22.10.2013, 16:18:32
    #38437197
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
GorloPavel,
в субд параллелизм делается за счёт параллельных коннектов. а не потоков в одном коннекте.
Так заточены СУБД.
...
Рейтинг: 0 / 0
22.10.2013, 16:53:44
    #38437270
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Petro123GorloPavel,
в субд параллелизм делается за счёт параллельных коннектов. а не потоков в одном коннекте.
Так заточены СУБД.
Так коннекты то разные получаются. Каждый поток выполняет функцию. И соединение открывается при каждом ее использовании. Получается 10 потоков = 10 соединений. А вот почему долго не падает в finally в некоторых случаях я не пойму.
...
Рейтинг: 0 / 0
22.10.2013, 17:00:20
    #38437283
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
GorloPavelPetro123GorloPavel,
в субд параллелизм делается за счёт параллельных коннектов. а не потоков в одном коннекте.
Так заточены СУБД.
Так коннекты то разные получаются. Каждый поток выполняет функцию. И соединение открывается при каждом ее использовании. Получается 10 потоков = 10 соединений. А вот почему долго не падает в finally в некоторых случаях я не пойму.
проверил? Протестировал?
...
Рейтинг: 0 / 0
22.10.2013, 17:18:24
    #38437314
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Твой код тормозит на mResult=mStatement.executeQuery() ?

Если да - тогда проблема не в Java. Выкладывай текст хранимой процедуры
на неизвестном языке и будем дальше думать куда переносить твой вопрос.
...
Рейтинг: 0 / 0
22.10.2013, 17:20:33
    #38437320
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Petro123GorloPavelпропущено...

Так коннекты то разные получаются. Каждый поток выполняет функцию. И соединение открывается при каждом ее использовании. Получается 10 потоков = 10 соединений. А вот почему долго не падает в finally в некоторых случаях я не пойму.
проверил? Протестировал?

А что тут проверять. Очевидно. У каждого объекта класса есть эта функция. При вызове функции в ее теле создается подключение. И SHOW FULL PROCESSLIST мне показывает несколько подключений. Проблема в том что некоторые подключения живут по 2мс как и положено, а другие по 500 что не является нормальным. В коде тут есть ошибка... Надо: if(mConnection!=null){mConnection.close();}. Но в реальном коде все как положено. Это просто я сейчас эксперементировал и убирал эту строку и незаметил как скопипастил в пост.
...
Рейтинг: 0 / 0
22.10.2013, 17:23:17
    #38437322
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Процедура простая:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE DEFINER = 'xxx' PROCEDURE `SEND_HOST_PREVIEW`(
        IN host_id INTEGER(11)
    )
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
	SELECT uo.user_id FROM users_online uo
	INNER JOIN users_hosts uh on uh.user_id=uo.user_id
	INNER JOIN hosts_online ho on uh.host_id=ho.host_id and ho.host_id=host_id
	GROUP BY uo.user_id;
END;
...
Рейтинг: 0 / 0
22.10.2013, 17:48:36
    #38437367
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
GorloPavelТакое ощущение что хранимая процедура
ну дак и приведи трейс только для хранимки. Без всякой обвязки и цикла по рекордсету.
И коммит тоже лишний, т.к. хранимка только читает.
...
Рейтинг: 0 / 0
22.10.2013, 17:56:26
    #38437386
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Petro123GorloPavelТакое ощущение что хранимая процедура
ну дак и приведи трейс только для хранимки. Без всякой обвязки и цикла по рекордсету.
И коммит тоже лишний, т.к. хранимка только читает.

Про коммит понял. А вот как мне тут от цикла избавиться я не понял :). Кстати тут кокраз массив из тех самых объектов в котором эта функция. В любом случае спасибо вам.
...
Рейтинг: 0 / 0
22.10.2013, 18:01:53
    #38437402
Мужик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Petro123И коммит тоже лишний, т.к. хранимка только читает.
Я бы не был так категоричен. Это зависит от уровня изоляции транзакций.
...
Рейтинг: 0 / 0
22.10.2013, 18:11:28
    #38437418
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Не знаю как в этих ваших МайСкл-ях. Но если-бы это был Oracle то нужно оптимизировать
и фазу Execute, и фазу Fetch (в зависимости от удачности выбора плана у нас может
быть одно либо другое). Автор ты добавь себе SessionHelper.trace("Checkpoint1 "+hostId), после входа
в процедуру, потом после execute и потом после завершения считывания строк. В самом конце.
И дай кусок лога. И время в логах сделай с точостью до милисекунд.
...
Рейтинг: 0 / 0
22.10.2013, 18:26:21
    #38437448
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Мужик,
ну, если рассматривать экзотику и каждую БД, то и Java не нужна.
Изоляция по умолчанию. При обрыве сети ничего без коммита не отвалится...всего один SQL оператор.
Там и хранимку можно убрать imho
...
Рейтинг: 0 / 0
22.10.2013, 18:30:49
    #38437455
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Хранимку нужно убрать.
...
Рейтинг: 0 / 0
22.10.2013, 19:18:31
    #38437515
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Мы не знаем где хранимка ЕЩЕ используется. Убирать нельзя. Но можно
переписать этот код так чтобы от нее не было зависимости в Java.
...
Рейтинг: 0 / 0
23.10.2013, 04:23:36
    #38437795
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
maytonМы не знаем где хранимка ЕЩЕ используется. Убирать нельзя. Но можно
переписать этот код так чтобы от нее не было зависимости в Java.
Больше нигде.
...
Рейтинг: 0 / 0
23.10.2013, 09:24:34
    #38437858
maxkar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
GorloPavelЧто не так в коде?

Типичный размер Hub.SESSIONS какой? Какое количество записей в среднем возвращает ваш запрос? У вас на ровном месте сложность цикла O(N*M), где N - размер Hub.SESSIONS, M - размер возвращаемых данных. Вы бы ваш sessions во что-нибудь более приличное преобразовали. В какой-нибудь Map, что-ли. Или не преобразовали, а ввели дополнительный map. Тогда сложность будет либо O(N + M), либо O((M + N) * log(N)), зависит от того, какую map вы возьмете.

Еще. Покажите код вашего SESSIONS[i].sendData. Может, у вас там код тормозит, а не в обращении к хранимке. А открытый курсор (итерации) по результату держат соединения, пока все не обработается.

Ну и на последок. Ваша хранимка оптимально устроена? Вы ее план смотрели? С альтернативами вроде select distinct сравнивали?
...
Рейтинг: 0 / 0
23.10.2013, 10:13:34
    #38437926
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
GorloPavelmaytonМы не знаем где хранимка ЕЩЕ используется. Убирать нельзя. Но можно
переписать этот код так чтобы от нее не было зависимости в Java.
Больше нигде.
Поставь логгирование и дай цифры. Мнеж интересно где в этом Мускле может быть тормоз.
...
Рейтинг: 0 / 0
23.10.2013, 15:45:39
    #38438528
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Функция sendData:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public synchronized Boolean sendData(Object packet) 
   {
		try {
			mClientSocket.getOutputStream().write(mPacketCreator.CreatePacket(Hub.GSON.toJson(packet).getBytes("UTF-8")));
			mClientSocket.getOutputStream().flush();
			return true;
		} catch (Exception e) {
			return false;
		}
	}
...
Рейтинг: 0 / 0
23.10.2013, 15:52:08
    #38438541
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
maytonGorloPavelпропущено...

Больше нигде.
Поставь логгирование и дай цифры. Мнеж интересно где в этом Мускле может быть тормоз.

Кусок лога(в скобках System.currentTimeMillis()):

Код: 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.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
(1382528493068)sendHostPreview - 37645
(1382528493074)executeQuery - 37645
(1382528493075)finish - 37645
(1382528493081)sendHostPreview - 162197
(1382528493088)executeQuery - 162197
(1382528493090)finish - 162197
(1382528493150)sendHostPreview - 159473
(1382528493238)sendHostPreview - 50559
(1382528493251)executeQuery - 159473
(1382528493253)finish - 159473
(1382528493305)executeQuery - 50559
(1382528493307)finish - 50559
(1382528493447)sendHostPreview - 143614
(1382528493453)executeQuery - 143614
(1382528493454)finish - 143614
(1382528494071)sendHostPreview - 135844
(1382528494078)executeQuery - 135844
(1382528494110)sendHostPreview - 135873
(1382528494115)executeQuery - 135873
(1382528494207)finish - 135844
(1382528494251)finish - 135873
(1382528499536)sendHostPreview - 114161
(1382528499548)executeQuery - 114161
(1382528499576)finish - 114161
(1382528506920)sendHostPreview - 134355
(1382528506925)executeQuery - 134355
(1382528506926)finish - 134355
(1382528509656)sendHostPreview - 48268
(1382528509661)executeQuery - 48268
(1382528509709)finish - 48268
(1382528512849)sendHostPreview - 154548
(1382528512854)executeQuery - 154548
(1382528512854)finish - 154548
(1382528512864)sendHostPreview - 48268
(1382528512869)executeQuery - 48268
(1382528512869)finish - 48268
(1382528512874)sendHostPreview - 114161
(1382528512877)sendHostPreview - 98423
(1382528512879)executeQuery - 114161
(1382528512880)finish - 114161
(1382528512881)executeQuery - 98423
(1382528512881)finish - 98423
(1382528512911)sendHostPreview - 37645
(1382528512915)executeQuery - 37645
(1382528512915)finish - 37645
(1382528512925)sendHostPreview - 159473
(1382528512925)sendHostPreview - 161387
(1382528512928)sendHostPreview - 160985
(1382528512929)executeQuery - 161387
(1382528512929)finish - 161387
(1382528512931)executeQuery - 159473
(1382528512932)finish - 159473
(1382528512932)executeQuery - 160985
(1382528512932)finish - 160985
(1382528512940)sendHostPreview - 139315
(1382528512944)executeQuery - 139315
(1382528512948)finish - 139315
(1382528512949)sendHostPreview - 50559
(1382528512949)sendHostPreview - 139317
(1382528512954)executeQuery - 139317
(1382528512955)finish - 139317
(1382528512956)executeQuery - 50559
(1382528512957)finish - 50559
(1382528513000)sendHostPreview - 162034
(1382528513004)executeQuery - 162034
(1382528513005)finish - 162034
(1382528513057)sendHostPreview - 151492
(1382528513062)executeQuery - 151492
(1382528513062)finish - 151492
(1382528513123)sendHostPreview - 149238
(1382528513127)executeQuery - 149238
(1382528513128)finish - 149238
(1382528513433)sendHostPreview - 131414
(1382528513438)executeQuery - 131414
(1382528513439)finish - 131414
(1382528513523)sendHostPreview - 116886
(1382528513524)sendHostPreview - 162515
(1382528513531)executeQuery - 116886
(1382528513531)finish - 116886
(1382528513532)executeQuery - 162515
(1382528513533)finish - 162515
(1382528513541)sendHostPreview - 161492
(1382528513545)executeQuery - 161492
(1382528513546)finish - 161492
(1382528513553)sendHostPreview - 161497
(1382528513556)executeQuery - 161497
(1382528513561)finish - 161497
(1382528513583)sendHostPreview - 135873
(1382528513587)executeQuery - 135873
(1382528513588)finish - 135873
(1382528513738)sendHostPreview - 135844
(1382528513742)executeQuery - 135844
(1382528513743)finish - 135844
(1382528513763)sendHostPreview - 143614
(1382528513767)executeQuery - 143614
(1382528513767)finish - 143614
(1382528514503)sendHostPreview - 135841
(1382528514509)executeQuery - 135841
(1382528514861)finish - 135841
(1382528517525)sendHostPreview - 161068
(1382528517529)executeQuery - 161068
(1382528517530)finish - 161068
(1382528520258)sendHostPreview - 45635
(1382528520261)executeQuery - 45635
(1382528520266)finish - 45635
(1382528520295)sendHostPreview - 45623
(1382528520299)executeQuery - 45623
(1382528520299)finish - 45623
(1382528527304)sendHostPreview - 121324
(1382528527309)executeQuery - 121324
(1382528527356)sendHostPreview - 122042
(1382528527361)executeQuery - 122042
(1382528527779)finish - 121324
(1382528527785)finish - 122042
(1382528529243)sendHostPreview - 162305
(1382528529247)executeQuery - 162305
(1382528529265)finish - 162305
(1382528532827)sendHostPreview - 136526
(1382528532829)sendHostPreview - 154216
(1382528532829)sendHostPreview - 98423
(1382528532830)sendHostPreview - 96176
(1382528532833)sendHostPreview - 103646
(1382528532840)executeQuery - 154216
(1382528532840)finish - 154216
(1382528532845)executeQuery - 136526
(1382528532845)finish - 136526
(1382528532845)executeQuery - 96176
(1382528532845)finish - 96176
(1382528532846)executeQuery - 98423
(1382528532846)finish - 98423
(1382528532851)executeQuery - 103646
(1382528532858)finish - 103646


...
Рейтинг: 0 / 0
23.10.2013, 15:57:25
    #38438555
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
Запустите под профайлером или просто делайте дампы потоков.
Там будет четко видно на чем потоки блокируются.
...
Рейтинг: 0 / 0
23.10.2013, 15:59:59
    #38438559
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
ОК. HostId-s немного смешались. Надо будет рассортировтать их и посчитать интервалы.
...
Рейтинг: 0 / 0
23.10.2013, 16:00:31
    #38438560
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
BlazkowiczЗапустите под профайлером или просто делайте дампы потоков.
Там будет четко видно на чем потоки блокируются.

Знать бы еще как это делать. Приложение запущено на удаленной машине. Как снять дамп? Спасибо.
...
Рейтинг: 0 / 0
23.10.2013, 16:03:11
    #38438562
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
kill -3 PID
можно jdk/bin/jstack PID
...
Рейтинг: 0 / 0
23.10.2013, 16:04:30
    #38438564
GorloPavel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
maytonОК. HostId-s немного смешались. Надо будет рассортировтать их и посчитать интервалы.
Легко вычислить тормозов... Там где сразу подряд finish, значит они не так быстро сработали. Количество SESSIONS = 13k. Количество возвращаемых записей в большинстве случаев не более 2-5.
...
Рейтинг: 0 / 0
23.10.2013, 16:04:43
    #38438565
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Долгое закрытие JDBC
А какой размер SESSIONS[]? По одному элементу на поток, или меньше?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Долгое закрытие JDBC / 25 сообщений из 59, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]