powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с ConcurrentHashMap
25 сообщений из 99, страница 2 из 4
Проблема с ConcurrentHashMap
    #38520766
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczС каким типом сессий возникает проблема?
Host
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520771
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczGorloPavelНет не final.
Зря.
Может быть в этом проблема? Но ведь нигде не меняется. Это точно.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520781
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelМожет быть в этом проблема? Но ведь нигде не меняется. Это точно.
Может быть что угодно. Вы ничего не логируете ведь. Совершенно не понятно что из каких потоков вызывается.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520788
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczGorloPavelМожет быть в этом проблема? Но ведь нигде не меняется. Это точно.
Может быть что угодно. Вы ничего не логируете ведь. Совершенно не понятно что из каких потоков вызывается.
removeSession вызывает сам поток. Метод в котором put вызывает он же. Т.е поток сам добавляет себя в HashMap и удаляет когда происходит отключение.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520791
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavel ,
Понятно, тогда есть два варианта:
1) Все операции с конкретным уникальным ID идут только в одном потоке , вы в этом уверены на 100%. Тогда у вас какой-то косяк с отловом исключений при работе с базой, или просто какая-то бага в коде.
2) Все таки не все операции для данного ID идут в одном потоке. Или же все, но ID может быть не уникальным. Тогда это скорее всего баг с concurrency.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520794
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И покажите метод Session.run().
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520795
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv1) Все операции с конкретным уникальным ID идут только в одном потоке , вы в этом уверены на 100%. Тогда у вас какой-то косяк с отловом исключений при работе с базой, или просто какая-то бага в коде.

Судя по предущему вопросу и этой теме GorloPavel на 100% уверен, что это так. А на самом деле иначе.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520796
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelremoveSession вызывает сам поток. Метод в котором put вызывает он же. Т.е поток сам добавляет себя в HashMap и удаляет когда происходит отключение.
Код: java
1.
2.
3.
if (getPartner() != null) {
 getPartner().killSession();
}


Этот код случайно не вызывает removeSession другой сессии из своего потока?
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520799
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot cdtyjv] GorloPavel ,
Понятно, тогда есть два варианта:
1) Все операции с конкретным уникальным ID идут только в одном потоке , вы в этом уверены на 100%. Тогда у вас какой-то косяк с отловом исключений при работе с базой, или просто какая-то бага в коде.
Операция чтения и получения Session может быть в другом потоке. Те вот это к примеру:
Код: java
1.
Session hostSession = Hub.HOSTS_SESSIONS.get(getHostId());//Ищем хост среди подключений
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520804
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЭтот код случайно не вызывает removeSession другой сессии из своего потока?
Нет. Вот он:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public void killSession() {
		if (mClientSocket != null) {
			try {
				mClientSocket.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}



После него происходит Exception в потоке cессии и она уже выполняет removeSession.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520809
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvИ покажите метод Session.run().

На первой странице, там где removeSession вызывается. Это и есть метод run, т.к
Session implements Runnable
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520819
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczСудя по предущему вопросу и этой теме GorloPavel на 100% уверен, что это так. А на самом деле иначе.
Ну ведь вы сами видите где removeSession, а put-ы происходят по результатам mPacketSplitter.splitData(dataBuffer, receivedBytes); в методе run. Сам HashMap статическое поле класса Hub.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520829
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczgetSessionId() возвращает final поле?
Не понял кстати. Ведь SessionId устанавливается в процессе работы. Как оно может быть final?
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520832
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelНа первой странице, там где removeSession вызывается. Это и есть метод run, т.к
Session implements Runnable Окей, где тогда сессия кладется в ConcurrentHashMap?
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520833
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelОперация чтения и получения Session может быть в другом потоке. Те вот это к примеру:Что-то я уже устал, если честно Одно противоречие за другим.
Хорошо, что такое "получение" сессии. Вот какой-то другой поток "получил" сессию, что он может с ней дальше делать?
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520847
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelBlazkowiczgetSessionId() возвращает final поле?
Не понял кстати. Ведь SessionId устанавливается в процессе работы. Как оно может быть final?
Устанавливать sessionId в конструкторе session после процесса работы.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520850
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvGorloPavelОперация чтения и получения Session может быть в другом потоке. Те вот это к примеру:Что-то я уже устал, если честно Одно противоречие за другим.
Хорошо, что такое "получение" сессии. Вот какой-то другой поток "получил" сессию, что он может с ней дальше делать?
Я привел пример выше.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520856
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

Вызывать методы в которых не происходят изменения id или удаление сессии из HashMap. Почитайте внимательно тему. remove только в одном месте. Id сессий устанавлтваются единожды при авторизации клиента. Id это автоинкриментное-уникальное поле в БД.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520870
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GorloPavel,
каким образом обеспечивается уникальность getHostId() для каждого потока?
Если по ip, то что будет, если на одном хосте создадут 2 соединения, а потом 1 прибъют?
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520874
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraGorloPavel,
каким образом обеспечивается уникальность getHostId() для каждого потока?
Если по ip, то что будет, если на одном хосте создадут 2 соединения, а потом 1 прибъют?
Не по ip
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520876
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelПочитайте внимательно тему.
Такое ощущение, что у нас с cdtyjv косяк к продакшн сервере.

Мне тоже до сих пор не понятно. Откуда уверенность что проблема в удалении, а не в создании.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520907
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GorloPavelПочитайте внимательно тему.Коллега, вот вокруг вас собралось уже 4-5 мемберов, и отчаянно пытаются понять, что у вас там происходит. Как думаете, это мы все тупые и невнимательные или это вы плохо объясняете? Повторю два принципиальных на данный момент вопроса:
1) Каким образом вы гарантируете уникальность идентификатора? Покажите код.
2) Кто и откуда добавляет сессии в мапку? Где вызов ConcurrentHashMap.put()? Ни в одном из предоставленных вами колчков кода его нет.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38520943
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно и я тоже попытаюсь потелепатить?

Вот вы пишите, что у вас sessionId - это автоинкрементное поле в базе. Но как вы его получаете?
Большинство новичков делают insert, а потом берут это поле при помощи чего-то вроде "SELECT MAX(id) ....". Вот мне почему-то кажется, что вы сделали так (ни разу не встречал ничего другого), но фишка в том, что так делать нельзя! Ведь после insert может сразобтать еще один insert в другом потоке, а только потом select в исходном и другом. В результате вы двух потоках заимеете одинаковый id сессии. Потом один из них завершает сессию и удаляет ваш id из мапы...

А ведь таких потоков может быть и больше 2.

Как быть? В mysql есть функция LAST_INSERT_ID(), в других базах - свои для решения этой проблемы, и еще можно дергать эту функцию через jdbc (гуглить: jdbc last insert id). Надо пользоваться ими. Они возвращают именно то id, которое было только что вставлено в данно коннекшене с базой.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38521201
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvКаким образом вы гарантируете уникальность идентификатора? Покажите код.

Да что тут показывать. Все просто. В БД есть пара логин-пароль, у записи автоинкриментное поле host_id. Клиент посылает данные авторизации выполняется SELECT и в программу возвращается id.
...
Рейтинг: 0 / 0
Проблема с ConcurrentHashMap
    #38521202
GorloPavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokВот вы пишите, что у вас sessionId - это автоинкрементное поле в базе.
Смотрите выше. В других случаях естественно используется last_insert_id .
...
Рейтинг: 0 / 0
25 сообщений из 99, страница 2 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с ConcurrentHashMap
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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