Проверка, существует ли таблица MySQL в программе Java, использующей SQLException - PullRequest
0 голосов
/ 10 января 2012

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

Ответы [ 2 ]

4 голосов
/ 10 января 2012

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

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

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

1 голос
/ 10 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...