2015-11-20 3 views
1

Я застрял в огромном и старом проекте (j2sdk 1.4.2, Tomcat 4.1.29, MySQL 5.0.51a), что мне нужно установить новую среду разработки для на работе.MySQL TINYINT (1) таинственно сопоставлен с Java-типом Integer

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

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

Вот проблема: когда запрос Java приложения некоторые данные, которые хранятся в БД, как TINYINT(1), эти данные возвращаются в приложение Java, как java.lang.Integer, не java.lang.Boolean, как я хотел бы.

Примечание: версия соединителя JDBC, используемая сервером Tomcat, является mysql-connector-java-3.0.11-stable.

Что я испытал до сих пор (без результата):

  • обновления/понизить разъем MySQL
  • добавил tinyInt1isBit=<true/1> в конце моей строки подключения
  • обновления/понизить БД MySQL, всегда тот же самый дамп данных, который я дал по исходному коду
  • Множество других вещей, о которых я даже не мог вспомнить, потому что я испытал так много вещей: -/

Теперь я уверен, что проблема связана с соединителем JDBC MySQL, используемым сервером Tomcat. Таким образом, когда я изменил версию соединителя, больше ничего не работало (что не могло даже подключить пользователя).

Любые идеи?

EDIT: Я забыл точное, что в другой части приложения Java, запрос данных хранится в виде DECIMAL возвращаются как java.lang.String! Это также основная проблема, которую я должен решить, но я думаю, что эти два связаны с одной и той же причиной.

+2

Вы говорите «вернулись в приложение Java», но если вы не используете стандартный «ResultSet», это звучит как ваш собственный код точно идентифицирует столбец TINYINT и обрабатывает его как числовой тип. – chrylis

+0

звуков вам нужно будет создать вспомогательный класс для этих случаев ... –

+0

@Jordi Castilla: к сожалению, я еще не могу добавить код, так как этот код должен работать правильно (как он уже работает в производстве окружающей среды в течение нескольких лет). На данный момент моя цель - создать стабильную среду разработки, причем все работает как можно плавно и без изменения какого-либо кода. Вот почему я думаю, что причиной этого может быть и коннектор. Но я не могу понять, почему: -/ – TheFrenchieCake

ответ

0

Итак, после полной недели работы мне удалось найти решение. Опасайтесь, это было глупо.

Я был прав, когда думал, что соединитель MySQL является источником моих проблем. Я решил повторить все, что я пробовал до сегодняшнего дня, чтобы решить эту проблему, и поэтому немного обновил соединитель (от версии от версии 1.0.11 до версии 3.1.14). Затем я повторно запустил проблемные запросы БД и заметил журнал ERROR, который я раньше не видел в своих журналах Tomcat: указанное имя БД было неправильным (что-то вроде myDB\?autoReconnect=true...). Действительно, \ был ошибочно вставлен перед частью аргументов соединения.

Я удалил виновного \ из строки подключения, перезапустил мой Tomcat и ... tadaaa! Мои проблемы решены!

Однако, я сделал тест с старым разъемом MySQL (v3.0.11), и она по-прежнему возвращает TINYINT(1) в java.lang.Integer и DECIMAL в java.lang.String. Поэтому я предполагаю, что клиент обновил свой соединитель MySQL на своем выпуске Tomcat без предупреждения.

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

2

От Connector/J documentation

MySQL Тип Название: TINYINT

Возврат значение GetColumnClassName: TINYINT

Возвращается в Java Класс:java.lang.Boolean если свойство конфигурации tinyInt1isBit устанавливается до значения true (по умолчанию), а размер хранилища - 1 или java.lang.Integer если нет.

Обратите внимание: или java.lang.Integer если нет. Проверьте свойство tinyInt1isBit и, возможно, внесите изменения.

Если вы уже пытались перезапустить сервер mysql.

+0

Спасибо за ответ :-), но я уже проверил это, дважды на самом деле; MySQL DB, который я использую, не был специально сконфигурирован каким-либо образом, поэтому для параметра 'tinyInt1isBit' должно быть установлено значение' true'; в любом случае я попытался установить его вручную, без каких-либо изменений. – TheFrenchieCake

Смежные вопросы