MySql в WinXP и Mac OS X - PullRequest
       24

MySql в WinXP и Mac OS X

4 голосов
/ 21 июня 2009

Я столкнулся с этой странной проблемой. Я пишу код на своей машине в Win XP, а затем перемещаю весь код на машину Mac OS X. Запуск его с помощью банок с машины XP. Я кодирую в Java и использую Hibernate для обработки базы данных.

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

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

А вот некоторые особенности:

  • Mac OS X 10,5 (x86_64)
  • Сервер сообщества MYSQL 5.1.35
  • mysql-connector-java-5.1.7-bin.jar JDBC-драйвер
  • Java (TM) 2 Runtime Environment, Standard Edition (сборка 1.5.0_16-b06-284)
  • Java HotSpot (TM) Клиентская виртуальная машина (сборка 1.5.0_16-133, смешанный режим, совместное использование)

пожалуйста, сообщите

2009-06-20 18:43:01,230 DEBUG [org.hibernate.type.IntegerType] - binding '11266' to parameter: 2
2009-06-20 18:43:01,230 DEBUG [org.hibernate.type.IntegerType] - binding '332' to parameter: 3
2009-06-20 18:43:01,281 DEBUG [org.hibernate.type.IntegerType] - binding '6' to parameter: 4
2009-06-20 18:43:01,281 DEBUG [org.hibernate.persister.entity.AbstractEntityPersister] - Inserting entity: [org.joshua.hibernate.dto.Pagedatecounts#289]
2009-06-20 18:43:01,281 DEBUG [org.hibernate.jdbc.AbstractBatcher] - Executing batch size: 1
2009-06-20 18:43:01,288 DEBUG [org.hibernate.jdbc.AbstractBatcher] - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
2009-06-20 18:43:01,288 DEBUG [org.hibernate.jdbc.AbstractBatcher] - closing statement
2009-06-20 18:43:01,289 DEBUG [org.hibernate.util.JDBCExceptionReporter] - Could not execute JDBC batch update [insert into wiki.page (langId, titleId, totalCounts, id) values (?, ?, ?, ?)]
java.sql.BatchUpdateException: Duplicate entry '1-11266' for key 'Page_lang_title'
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1693)
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1108)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92)
    at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
    at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:222)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2224)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.joshua.hibernate.dao.PageDAO.batchSave(PageDAO.java:70)
    at org.joshua.businesservice.PageServiceImpl.savePageDateCountBatch(PageServiceImpl.java:61)
    at org.joshua.wikidumps.DumpHandler.endElement(DumpHandler.java:192)
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:375)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:176)
    at org.joshua.wikidumps.PagesByNumberOfRecentEdits.execute(PagesByNumberOfRecentEdits.java:107)
    at org.joshua.wikidumps.PagesByNumberOfRecentEdits_ur.main(PagesByNumberOfRecentEdits_ur.java:19)
2009-06-20 18:43:01,290 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 1062, SQLState: 23000
2009-06-20 18:43:01,290 ERROR [org.hibernate.util.JDBCExceptionReporter] - Duplicate entry '1-11266' for key 'Page_lang_title'
2009-06-20 18:43:01,290 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

Ответы [ 2 ]

1 голос
/ 05 мая 2011

Я столкнулся с той же проблемой. Не знаю, если вы уже решили это. Во всяком случае, в моем случае это была проблема того, как MySQL создает таблицы и выполняет сравнение имен таблиц. В MacOsX мне пришлось установить переменные MySQL «lower_case_table_names» в 1 (по умолчанию это было 0), что является рекомендуемым значением при использовании InnoDB. И это решило мою проблему (которая, как и вы, заключалась в том, что, похоже, Hibernate не собирал автоматически сгенерированные идентификаторы).

Надеется, что это может помочь, Риккардо.

1 голос
/ 22 июня 2009

Очень мало что можно сделать, но вот что я могу из этого сделать:

  1. Уникальный ключ, который нарушается, - это комбинированный ключ в столбце заголовка и языка. (Судя по названию (Page_lang_title, где lang_id и title_id - имя столбца) и значению ключа (1-11266, фактически комбинация двух значений), который отображается в трассировке стека).
  2. Вы поддерживаете количество страниц (запрос?) Для вики-страницы. Это, конечно, подвержено проблемам с параллелизмом, так как несколько потоков (запросов) одновременно обращаются к одной и той же странице.
  3. Вы, вероятно, делаете пакетное обновление (или что-то еще), и вы дважды нажали одну и ту же комбинацию . Ваша логика что-то вроде "со страницы, где page_id =? And lang_id =?" поскольку вы запускаете пакет в одной и той же транзакции и используете hibernate для после синхронизации транзакции, ваша вставка в таблицу обрабатывается только после того, как вы зафиксировали транзакцию, и поэтому вы пытаетесь вставить одну и ту же комбинацию lang_id и page_id дважды.

Теперь есть несколько вещей, которые вы можете сделать:

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

Если подумать: разве у сущности Pagedatecount отсутствует столбец даты? Кажется, он не вставляется.

...