|
|
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
BlazkowiczС каким типом сессий возникает проблема? Host ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:05 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
BlazkowiczGorloPavelНет не final. Зря. Может быть в этом проблема? Но ведь нигде не меняется. Это точно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:05 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
GorloPavelМожет быть в этом проблема? Но ведь нигде не меняется. Это точно. Может быть что угодно. Вы ничего не логируете ведь. Совершенно не понятно что из каких потоков вызывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:10 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
BlazkowiczGorloPavelМожет быть в этом проблема? Но ведь нигде не меняется. Это точно. Может быть что угодно. Вы ничего не логируете ведь. Совершенно не понятно что из каких потоков вызывается. removeSession вызывает сам поток. Метод в котором put вызывает он же. Т.е поток сам добавляет себя в HashMap и удаляет когда происходит отключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:14 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
GorloPavel , Понятно, тогда есть два варианта: 1) Все операции с конкретным уникальным ID идут только в одном потоке , вы в этом уверены на 100%. Тогда у вас какой-то косяк с отловом исключений при работе с базой, или просто какая-то бага в коде. 2) Все таки не все операции для данного ID идут в одном потоке. Или же все, но ID может быть не уникальным. Тогда это скорее всего баг с concurrency. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:16 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
И покажите метод Session.run(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:17 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
cdtyjv1) Все операции с конкретным уникальным ID идут только в одном потоке , вы в этом уверены на 100%. Тогда у вас какой-то косяк с отловом исключений при работе с базой, или просто какая-то бага в коде. Судя по предущему вопросу и этой теме GorloPavel на 100% уверен, что это так. А на самом деле иначе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:17 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
GorloPavelremoveSession вызывает сам поток. Метод в котором put вызывает он же. Т.е поток сам добавляет себя в HashMap и удаляет когда происходит отключение. Код: java 1. 2. 3. Этот код случайно не вызывает removeSession другой сессии из своего потока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:18 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
[quot cdtyjv] GorloPavel , Понятно, тогда есть два варианта: 1) Все операции с конкретным уникальным ID идут только в одном потоке , вы в этом уверены на 100%. Тогда у вас какой-то косяк с отловом исключений при работе с базой, или просто какая-то бага в коде. Операция чтения и получения Session может быть в другом потоке. Те вот это к примеру: Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:20 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЭтот код случайно не вызывает removeSession другой сессии из своего потока? Нет. Вот он: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. После него происходит Exception в потоке cессии и она уже выполняет removeSession. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:22 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
cdtyjvИ покажите метод Session.run(). На первой странице, там где removeSession вызывается. Это и есть метод run, т.к Session implements Runnable ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:24 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
BlazkowiczСудя по предущему вопросу и этой теме GorloPavel на 100% уверен, что это так. А на самом деле иначе. Ну ведь вы сами видите где removeSession, а put-ы происходят по результатам mPacketSplitter.splitData(dataBuffer, receivedBytes); в методе run. Сам HashMap статическое поле класса Hub. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:29 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
BlazkowiczgetSessionId() возвращает final поле? Не понял кстати. Ведь SessionId устанавливается в процессе работы. Как оно может быть final? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:36 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
GorloPavelНа первой странице, там где removeSession вызывается. Это и есть метод run, т.к Session implements Runnable Окей, где тогда сессия кладется в ConcurrentHashMap? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:38 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
GorloPavelОперация чтения и получения Session может быть в другом потоке. Те вот это к примеру:Что-то я уже устал, если честно Одно противоречие за другим. Хорошо, что такое "получение" сессии. Вот какой-то другой поток "получил" сессию, что он может с ней дальше делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:40 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
GorloPavelBlazkowiczgetSessionId() возвращает final поле? Не понял кстати. Ведь SessionId устанавливается в процессе работы. Как оно может быть final? Устанавливать sessionId в конструкторе session после процесса работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:50 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
cdtyjvGorloPavelОперация чтения и получения Session может быть в другом потоке. Те вот это к примеру:Что-то я уже устал, если честно Одно противоречие за другим. Хорошо, что такое "получение" сессии. Вот какой-то другой поток "получил" сессию, что он может с ней дальше делать? Я привел пример выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:51 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
cdtyjv, Вызывать методы в которых не происходят изменения id или удаление сессии из HashMap. Почитайте внимательно тему. remove только в одном месте. Id сессий устанавлтваются единожды при авторизации клиента. Id это автоинкриментное-уникальное поле в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 17:55 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
GorloPavel, каким образом обеспечивается уникальность getHostId() для каждого потока? Если по ip, то что будет, если на одном хосте создадут 2 соединения, а потом 1 прибъют? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 18:07 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
ivanraGorloPavel, каким образом обеспечивается уникальность getHostId() для каждого потока? Если по ip, то что будет, если на одном хосте создадут 2 соединения, а потом 1 прибъют? Не по ip ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 18:09 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
GorloPavelПочитайте внимательно тему. Такое ощущение, что у нас с cdtyjv косяк к продакшн сервере. Мне тоже до сих пор не понятно. Откуда уверенность что проблема в удалении, а не в создании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 18:13 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
GorloPavelПочитайте внимательно тему.Коллега, вот вокруг вас собралось уже 4-5 мемберов, и отчаянно пытаются понять, что у вас там происходит. Как думаете, это мы все тупые и невнимательные или это вы плохо объясняете? Повторю два принципиальных на данный момент вопроса: 1) Каким образом вы гарантируете уникальность идентификатора? Покажите код. 2) Кто и откуда добавляет сессии в мапку? Где вызов ConcurrentHashMap.put()? Ни в одном из предоставленных вами колчков кода его нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 18:39 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
А можно и я тоже попытаюсь потелепатить? Вот вы пишите, что у вас sessionId - это автоинкрементное поле в базе. Но как вы его получаете? Большинство новичков делают insert, а потом берут это поле при помощи чего-то вроде "SELECT MAX(id) ....". Вот мне почему-то кажется, что вы сделали так (ни разу не встречал ничего другого), но фишка в том, что так делать нельзя! Ведь после insert может сразобтать еще один insert в другом потоке, а только потом select в исходном и другом. В результате вы двух потоках заимеете одинаковый id сессии. Потом один из них завершает сессию и удаляет ваш id из мапы... А ведь таких потоков может быть и больше 2. Как быть? В mysql есть функция LAST_INSERT_ID(), в других базах - свои для решения этой проблемы, и еще можно дергать эту функцию через jdbc (гуглить: jdbc last insert id). Надо пользоваться ими. Они возвращают именно то id, которое было только что вставлено в данно коннекшене с базой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2014, 19:05 |
|
||
|
Проблема с ConcurrentHashMap
|
|||
|---|---|---|---|
|
#18+
cdtyjvКаким образом вы гарантируете уникальность идентификатора? Покажите код. Да что тут показывать. Все просто. В БД есть пара логин-пароль, у записи автоинкриментное поле host_id. Клиент посылает данные авторизации выполняется SELECT и в программу возвращается id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 03:59 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38520804&tid=2127814]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
177ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 219ms |
| total: | 489ms |

| 0 / 0 |
