2012-01-10 5 views
0

У меня есть веб-приложение Java, где мои клиенты подключаются к веб-службе для обновления базы данных MySQL (используя JDBC) с их данными. Что я хочу сделать, так это проверить, существует ли запрашиваемая таблица, не используя MetaData каждый раз, когда клиент подключается и использует операцию веб-службы. Я думал просто выполнять INSERT каждый раз, и первый клиент, который подключается к веб-службе, вызовет SQLException, который я поймаю, посмотрите на его ErrorCode, чтобы решить, почему он вызван неэксистентной таблицей, и если это так, то (внутри catch), создайте таблицу, вставьте данные, которые не могли быть вставлены ранее из-за исключения, а затем создайте поток для обработки этого конкретного клиента (например, проверьте, чтобы он обновлял свою запись в базе данных каждые x секунд). Будет ли эта реализация выполнять эту работу? Будет ли поток работать правильно и все, даже если оно будет запущено внутри предложения catch исключения?Проверка наличия таблицы MySQL в Java-программе с использованием SQLException

ответ

4

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

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

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

+0

Благодарим вас за ответ! на мой взгляд, это не тот поток, который попытается создать таблицу, таблица будет создана внутри предложения catch исходной операции, а затем поток начнет с объекта «Connection» в качестве аргумента. – nikos

1

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