Как получить доступ к PreparedStatement в многопоточной среде? - PullRequest
0 голосов
/ 13 октября 2011

Я использую plain-JDBC-Database-Access в многопоточной среде.

Исключение, которое я недавно получил при работе с PreparedStatements (разновидность Oracle), заставило меня осознать тот факт, что они не потокобезопасны.

Конечно, всегда есть возможность использовать ThreadLocal-Variables (или синхронизировать доступ к выражению), но есть ли более умный способ доступа к базе данных многопоточным способом?

Изменить: Чтобы упростить проблему, я обращаюсь к базе данных только для чтения, поэтому параллельные транзакции меня не волнуют.

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Помещение PreparedStatement в ThreadLocal не решит проблему - даже Connection должно быть помещено в ThreadLocal. Но тогда вы должны убедиться, что соединение также разорвано должным образом, даже когда генерируются исключения.

А как насчет транзакций? Как убедиться, что одна транзакция не содержит данных из независимых потоков?

Лучшим способом было бы принять некоторые шаблоны контейнеров EJB - здесь инфраструктура заботится об управлении ресурсами и транзакциями, а также о пуле соединений. Но адаптировать существующий код в EJB или даже Spring правильно - задача не из легких.

0 голосов
/ 13 октября 2011

просто используйте ThreadLocal. Это самый простой способ.

. Вы также можете делегировать все обращения к базе данных в один поток (через очередь блокировки), что также устраняет гонки.это также позволяет упростить пакетирование многих операторов (хотя работает только для обновлений, запрос требует, чтобы ожидающие обновления сначала были сброшены)

...