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