|
|
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Необходимо сделать так, чтобы программа использовала только одно соединение с БД MySQL. Но проблема в том, что в программе есть класс в котором несколько методов работы с БД. В одних методах это просто чтение данных, в других запись. Но дело в том что все эти методы могут вызываться из разных потоков. Можно ли сделать так? И не будет ли проблем при вызове из synchronized блока метода с synchronized того-же объекта? Спасибо! Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 05:29:29 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavel, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 06:56:44 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
UsmanGorloPavel, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Спасибо! Но чем это отличается от просто объявления Connection mConnection и последующего открытия соединения к примеру в конструкторе? Что будет если поток №1 в методе №2 будет выполнять какую-нибудь хранимую процедуру, а в потоке №3 произойдет commit на этом единственном соединении? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 07:53:43 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
Usman, ваше решение не удовлетворяет требованиям автора. Получение соединения синхронизировано, а работа с этим соединением нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 12:04:51 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavelМожно ли сделать так?Можно. GorloPavelИ не будет ли проблем при вызове из synchronized блока метода с synchronized того-же объекта?Не будет. P.S.: Другое дело, что такая работа с СУБД как минимум не эффективна, и я с трудом могу придумать сценарии, когда такое будет требоваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 12:06:30 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavelНо чем это отличается от просто объявления Connection mConnection и последующего открытия соединения к примеру в конструкторе?В конструкторе проинициализируется переменная mConnection и откроется соединение.GorloPavelЧто будет если поток №1 в методе №2 будет выполнять какую-нибудь хранимую процедуру, а в потоке №3 произойдет commit на этом единственном соединении?mConnection - синхронизирующий объект (монитор). Синхроблок заблокирует монитор при входе одного из потоков. Другие потоки будут ожидать пока освободится mConnection. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 12:10:57 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
UsmanGorloPavelНо чем это отличается от просто объявления Connection mConnection и последующего открытия соединения к примеру в конструкторе?В конструкторе проинициализируется переменная mConnection и откроется соединение.GorloPavelЧто будет если поток №1 в методе №2 будет выполнять какую-нибудь хранимую процедуру, а в потоке №3 произойдет commit на этом единственном соединении?mConnection - синхронизирующий объект (монитор). Синхроблок заблокирует монитор при входе одного из потоков. Другие потоки будут ожидать пока освободится mConnection. Т.е пока поток #1 будет работать с методом #1 поток #2 при вызове методa #2 будет ждать пока поток #1 не закончит выполнение метода #1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 12:35:52 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
Т.е ваше решение будет работать так же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 12:37:43 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
Все равно не понимаю как в вашем случае такое возможно. Ведь getConnection вернет ссылку для потока №1 и выполнение метода продолжится дальше, а в этот момент ничего не мешает потоку №2 вызвать getConnection, получить туже ссылку и тоже начать что-то делать с БД, пока выполняется поток №1. Или я чего-то не понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 12:44:47 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavel , Повторюсь еще раз - решение Usman не работает так, как вы оно надо. Не работает . Логика работы с СУБД не синхронизирована. Более того, у него возможно одновременное существование нескольких разных соединений, которые не синхронизировано выполняют разные методы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 13:17:04 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavel, Ваш код не предусматривает возможности пере-создания соединения. Пусть оно в системе одно. Но если произошло аварийное отключение, то можно ведь и пересоздать. Пример от Usman показывает идею, но при этом не является потокобезопасным. Лучше всего взять готовый пул соединений и настроить его на одно соединение максимум. Во-первых готовый пул уже достаточно безопасен и меньше шансов накосячить с кокурентной инициализацией и прочими радостями. Во-вторых, ваш код перестанет быть привязан к логике "единственное соединени". Если вдруг нужно, "единственно" преващается в "множественное" простой настройкой пула. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 13:24:58 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavelВсе равно не понимаю как в вашем случае такое возможно. Ведь getConnection вернет ссылку для потока №1 и выполнение метода продолжится дальше, а в этот момент ничего не мешает потоку №2 вызвать getConnection, получить туже ссылку и тоже начать что-то делать с БД, пока выполняется поток №1. Или я чего-то не понимаю?Так и есть. След. пример подтверждение этому: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. И все в пределах одного соединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 13:26:42 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
В идеале, если в системе действительно много потоков и нужно синхронизировать вообще всю работу с базой, а не только получение соединений, то имеет смысл всю работу с базой выстраивать в очередь и разгребать одним единственным потоком. Например через ExecutorService и Future. Можно попробовать через Continuation сделать. Которого на pure Java пока нет. Но есть либы, тогда не придется логику методов разрывать для огранизации очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 13:38:07 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВ идеале, если в системе действительно много потоков и нужно синхронизировать вообще всю работу с базой, а не только получение соединений, то имеет смысл всю работу с базой выстраивать в очередь и разгребать одним единственным потоком. Например через ExecutorService и Future. Можно попробовать через Continuation сделать. Которого на pure Java пока нет. Но есть либы, тогда не придется логику методов разрывать для огранизации очереди. Да, проще говоря мне нужно чтобы все запросы к БД были по очереди. Не асинхронно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 14:00:05 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
Мой вариант, который первом посте не подходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 14:05:01 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavelМой вариант, который первом посте не подходит?В method3() может произойти DeadLock: Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 14:08:42 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
UsmanGorloPavelМой вариант, который первом посте не подходит?В method3() может произойти DeadLock: Код: java 1. 2. 3. 4. 5. На уровне JVM или СУБД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 14:14:07 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavelНа уровне JVM или СУБД?На уровне JVM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 14:17:09 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavelНа уровне JVM или СУБД?Дедлок на мониторах в JVM может произойти только в одном случае: 1) Есть больше чем один монитор 2) Захват этих нескольких мониторов из разных методов происходит неупорядоченно. В вашем примере монитор только один, следовательно дедлок невозможен ни при каких условиях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 14:17:30 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
cdtyjvGorloPavelНа уровне JVM или СУБД?Дедлок на мониторах в JVM может произойти только в одном случае: 1) Есть больше чем один монитор 2) Захват этих нескольких мониторов из разных методов происходит неупорядоченно. В вашем примере монитор только один, следовательно дедлок невозможен ни при каких условиях. Значит мой вариант жизнеспособен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 14:18:42 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
UsmanGorloPavelНа уровне JVM или СУБД?На уровне JVMDeadLock'а не будет. Проверил. Сорри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 14:35:21 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavel, Откуда потоки если надо синхронно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 14:37:21 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
Petro123GorloPavel, Откуда потоки если надо синхронно. Клиентские подключения, tcp сессии. Мне нужно синхронно выполнять некоторые вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 14:52:57 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavelЗначит мой вариант жизнеспособен?Жизнеспособен за исключением одного но. Он жизнеспособен, если вы всегда работаете с одним и тем же коннекшном. Если же, например, у вас он сдох, и надо пересоздать новый, то как раз здесь вы можете получить букет проблем с дедлоками и прочей многопоточной хренью. Как уже сказал Blazkowicz, надо смотреть в сторону пула соединений, который снимет вас всю головную боль касательно многопоточности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 15:03:24 |
|
||
|
Одно соединение на все методы.
|
|||
|---|---|---|---|
|
#18+
GorloPavel, задание странное. Даже самые лютые и суровые DBA-шники позволяют 2-4 физ. соединения создать. Вам с пулом на 1 соедиенние надо понимать что могут быть состояния когда с вашей стороны уже активности нет а пул всё еще не доступен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2013, 15:06:21 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38484831&tid=2128094]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 508ms |

| 0 / 0 |
