2013-09-12 2 views
6

Все мои классы имеютHibernate использует пессимистическую или оптимистичную блокировку?

@version

аннотацию, поэтому я предположил, что они использовали оптимистическое блокирование.

Но я следующее исключение в своих журналах, которые, как представляется, указывают на использование пессимистической блокировки. Так что это? (Я хочу использовать оптимистичную блокировку)

update Song set acoustidFingerprint=?, acoustidId=?, album=?, albumArtist=?, albumArtistSort=?, albumSort=?, amazonId=?, arranger=?, artist=?, artistSort=?, artists=?, barcode=?, bpm=?, catalogNo=?, comment=?, composer=?, composerSort=?, conductor=?, country=?, custom1=?, custom2=?, custom3=?, custom4=?, custom5=?, discNo=?, discSubtitle=?, discTotal=?, djmixer=?, duration=?, encoder=?, engineer=?, fbpm=?, filename=?, genre=?, grouping=?, isCompilation=?, isrc=?, keyOfSong=?, language=?, lastModified=?, lyricist=?, lyrics=?, media=?, mixer=?, mood=?, musicbrainzArtistId=?, musicbrainzDiscId=?, musicbrainzOriginalReleaseId=?, musicbrainzRecordingId=?, musicbrainzReleaseArtistId=?, musicbrainzReleaseCountry=?, musicbrainzReleaseGroupId=?, musicbrainzReleaseId=?, musicbrainzReleaseStatus=?, musicbrainzReleaseType=?, musicbrainzWorkId=?, musicipId=?, occasion=?, originalAlbum=?, originalArtist=?, originalLyricist=?, originalYear=?, producer=?, quality=?, rating=?, recordLabel=?, releaseYear=?, remixer=?, script=?, subtitle=?, tags=?, tempo=?, title=?, titleSort=?, track=?, trackTotal=?, urlDiscogsArtistSite=?, urlDiscogsReleaseSite=?, urlLyricsSite=?, urlOfficialArtistSite=?, urlOfficialReleaseSite=?, urlWikipediaArtistSite=?, urlWikipediaReleaseSite=?, version=? where recNo=? and version=? [50200-172] 
**org.hibernate.PessimisticLockException: Timeout trying to lock table ; SQL statement:** 
update Song set acoustidFingerprint=?, acoustidId=?, album=?, albumArtist=?, albumArtistSort=?, albumSort=?, amazonId=?, arranger=?, artist=?, artistSort=?, artists=?, barcode=?, bpm=?, catalogNo=?, comment=?, composer=?, composerSort=?, conductor=?, country=?, custom1=?, custom2=?, custom3=?, custom4=?, custom5=?, discNo=?, discSubtitle=?, discTotal=?, djmixer=?, duration=?, encoder=?, engineer=?, fbpm=?, filename=?, genre=?, grouping=?, isCompilation=?, isrc=?, keyOfSong=?, language=?, lastModified=?, lyricist=?, lyrics=?, media=?, mixer=?, mood=?, musicbrainzArtistId=?, musicbrainzDiscId=?, musicbrainzOriginalReleaseId=?, musicbrainzRecordingId=?, musicbrainzReleaseArtistId=?, musicbrainzReleaseCountry=?, musicbrainzReleaseGroupId=?, musicbrainzReleaseId=?, musicbrainzReleaseStatus=?, musicbrainzReleaseType=?, musicbrainzWorkId=?, musicipId=?, occasion=?, originalAlbum=?, originalArtist=?, originalLyricist=?, originalYear=?, producer=?, quality=?, rating=?, recordLabel=?, releaseYear=?, remixer=?, script=?, subtitle=?, tags=?, tempo=?, title=?, titleSort=?, track=?, trackTotal=?, urlDiscogsArtistSite=?, urlDiscogsReleaseSite=?, urlLyricsSite=?, urlOfficialArtistSite=?, urlOfficialReleaseSite=?, urlWikipediaArtistSite=?, urlWikipediaReleaseSite=?, version=? where recNo=? and version=? [50200-172] 
    at org.hibernate.dialect.H2Dialect$2.convert(H2Dialect.java:317) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
    at com.sun.proxy.$Proxy22.executeUpdate(Unknown Source) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3123) 
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3021) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3350) 
    at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:276) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) 
    at org.hibernate.event.internal.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:62) 
    at org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1182) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1611) 
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374) 
    at com.jthink.songkong.db.SongCache.loadSongsFromDatabase(SongCache.java:58) 
    at com.jthink.songkong.analyse.analyser.SongGroup.getSongs(SongGroup.java:48) 
    at com.jthink.songkong.analyse.analyser.MergeMusicBrainzMatches.matchToMissingTracks(MergeMusicBrainzMatches.java:318) 
    at com.jthink.songkong.analyse.analyser.MergeMusicBrainzMatches.call(MergeMusicBrainzMatches.java:105) 
    at com.jthink.songkong.analyse.analyser.MergeMusicBrainzMatches.call(MergeMusicBrainzMatches.java:40) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: org.h2.jdbc.JdbcSQLException: Timeout trying to lock table ; SQL statement: 
update Song set acoustidFingerprint=?, acoustidId=?, album=?, albumArtist=?, albumArtistSort=?, albumSort=?, amazonId=?, arranger=?, artist=?, artistSort=?, artists=?, barcode=?, bpm=?, catalogNo=?, comment=?, composer=?, composerSort=?, conductor=?, country=?, custom1=?, custom2=?, custom3=?, custom4=?, custom5=?, discNo=?, discSubtitle=?, discTotal=?, djmixer=?, duration=?, encoder=?, engineer=?, fbpm=?, filename=?, genre=?, grouping=?, isCompilation=?, isrc=?, keyOfSong=?, language=?, lastModified=?, lyricist=?, lyrics=?, media=?, mixer=?, mood=?, musicbrainzArtistId=?, musicbrainzDiscId=?, musicbrainzOriginalReleaseId=?, musicbrainzRecordingId=?, musicbrainzReleaseArtistId=?, musicbrainzReleaseCountry=?, musicbrainzReleaseGroupId=?, musicbrainzReleaseId=?, musicbrainzReleaseStatus=?, musicbrainzReleaseType=?, musicbrainzWorkId=?, musicipId=?, occasion=?, originalAlbum=?, originalArtist=?, originalLyricist=?, originalYear=?, producer=?, quality=?, rating=?, recordLabel=?, releaseYear=?, remixer=?, script=?, subtitle=?, tags=?, tempo=?, title=?, titleSort=?, track=?, trackTotal=?, urlDiscogsArtistSite=?, urlDiscogsReleaseSite=?, urlLyricsSite=?, urlOfficialArtistSite=?, urlOfficialReleaseSite=?, urlWikipediaArtistSite=?, urlWikipediaReleaseSite=?, version=? where recNo=? and version=? [50200-172] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) 
    at org.h2.message.DbException.get(DbException.java:158) 
    at org.h2.command.Command.filterConcurrentUpdate(Command.java:281) 
    at org.h2.command.Command.executeUpdate(Command.java:237) 
    at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:154) 
    at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:140) 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105) 
    at sun.reflect.GeneratedMethodAccessor55.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) 
    ... 24 more 

ответ

4

Вы используете optimistic locking, как ваше UPDATE заявления уже указует:

where recNo=? and version=? 

Присутствие version колонков что оптимистичная блокировка все.

Вы были введены в заблуждение PessimisticLockException, которые могут быть вызваны explicit or an implicit row-level lock.

Вы должны понимать, что блокировки приобретаются по строкам неявно, чтобы избежать грязной записи.This book объясняет эту тему множеством диаграмм и примеров кода.

7

Это исключение связано с блокировкой TimeOut.

Вызвано: org.h2.jdbc.JdbcSQLException: таймаут пытается заблокировать таблицу;

Проверить решение here

зимуют также предоставляет механизмы для реализации обоих типов блокировки в приложениях.

Ваша стратегия блокировки может быть оптимистичной или пессимистической.

Оптимистичный

Оптимистическая блокировка ssumes, что множество транзакций может завершить не влияя друг на друга, и поэтому операции могут осуществляться без блокировки ресурсов данных, которые они затрагивают. Перед совершением транзакции каждая транзакция проверяет, что никакая другая транзакция не изменила свои данные. Если проверка показывает противоречивые модификации, транзакционная транзакция возвращается назад [1].

Пессимистический

Пессимистический замок предполагает, что параллельные транзакции будут конфликтовать друг с другом, и требует ресурсов, которые будут заблокированы после того, как они будут считаны и только разблокирована после того, как приложение закончено, используя данные.

Подробности можно найти here

+0

Спасибо, я попробую параметр h2 MVCC, но ваш ответ не затрагивает мою основную проблему, и это по-другому: «Почему hibernate, по-видимому, использует пессимистическую блокировку, когда я полагаю, что она настроена на использование оптимистическая блокировка? –

+0

Обновление, только что обнаруженное Im уже использует MVCC или, по крайней мере, пытается подключиться URL-адрес: jdbc: h2: songkong/database; FILE_LOCK = SOCKET; MVCC = TRUE; DB_CLOSE_ON_EXIT = FALSE –

+0

Также попробуйте добавить: LOCK_TIMEOUT = 10000, т.е. 10 секунд поскольку тайм-аут по умолчанию очень низкий, т.е. 1 секунда или 1000 мс –

0

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

H2 может создавать ошибки, которые могут не отображаться в LIVE Database, например Oracle, MySQL a.s.o .. Значит, даже ваш код верен, но H2 может быть беспорядочным.

MVCC = true работает отлично. В то же время вы должны убедиться, что у вас есть полные интеграционные тесты для LIVE-подобных систем для вашего использования, чтобы проверить поведение LIVE Database.

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