2010-07-13 3 views
1

Я использую java для создания интерфейса для подключения к базе данных. Каждый раз, когда я хочу позвонить в базу данных, мне нужно создать новые подключения к базе данных, которые заставили бы вызвать базу данных, говорят в 10 раз медленнее.Доступ к переменным и методам в потоках

Чтобы избежать необходимости создавать новые подключения каждый раз, когда я хочу позвонить в базу данных, у меня есть поток java, который содержит всю информацию о соединении.

Чтобы написать/прочитать из базы данных, я хочу создать поток, который использует информацию о соединении, хранящуюся в уже запущенном потоке, использовать его для выполнения указанных функций чтения/записи, а затем выйти.

Однако у меня возникли проблемы с доступом к этой информации из потока, который уже запущен. Какой был бы лучший способ сделать это?

ответ

0

Зачем вам нужен поток, чтобы ваше соединение было открытым, просто сохраните его где-нибудь и выполните запросы, как только он вам понадобится. Должен ли он работать?

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

Чтобы преодолеть проблемы видимости, просто объявите его как переменную static final, поэтому у вас не возникнет проблем с доступом к ней из-за потока, в который вы его указали.

Еще одно простое решение (поскольку соединение, по-видимому, не является потокобезопасным) не должно использовать поток, а использовать только монитор: вы можете легко управлять механизмом /notify(), для которого поток, который хочет выполнить проверку запроса если соединение является «бесплатным». если он занимает монитор и делает все, что ему нужно, перед уведомлением всех ожидающих потоков.

+0

Никакой изменчивой статики! И как вы думаете, что вы собираетесь делать, когда у вас есть 'synchronizedList'? Мое предположение - внешняя синхронизация или, скорее, условия гонки. –

2

Это ужасная идея, потому что java.sql.Connection не является потокобезопасным.

Лучшей идеей было бы использовать пул соединений. Пусть каждый поток проверяет соединение, использует его и возвращает.

+0

Я не использую java.sql.Connection или любые другие реализаторы java sql –

+0

Вы написали свой собственный, используя API баз данных? Какая база данных? Если вы сделаете это потокобезопасным, я выведу свой комментарий. Если вы даже не подумали об этом или не знаете, что это значит, мой комментарий все еще стоит. – duffymo

+0

Я работаю над своим собственным API для небольшой системы баз данных текстовых файлов, над которой я тоже работаю. Я учитывал безопасность потоков. Это забавный проект. –

0

Почему вы это делаете? Существуют рамки, такие как Spring или аналогичные, которые будут управлять вашими подключениями для вас. Не изобретайте велосипедиста ...

+0

Повторно изобретать колесо? Г-н Кинг даже не хочет использовать JDBC для доступа к базе данных. – duffymo

+0

@duffymo;) некоторым людям нравится делать это ради учебы ... я думаю, я чувствую, что есть достаточно, чтобы смутить насчет того, чтобы не делать такие вещи ... плохо возьмите помощь, которую я могу получить, нарушать рамки ... – hvgotcodes

1

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

Если вы уже работаете в контейнере, используйте DataSource. смотреть в C3P0 (http://sourceforge.net/projects/c3p0/) и Викисклад ДБХП (http://commons.apache.org/dbcp/)

0

Я бы рекомендовал использовать пул родового объекта вместо создания собственного решения и предложить, чтобы проверить Commons Pool от Apache Commons (это API для родового объекта объединение, это не DBCP).