web-dev-qa-db-ger.com

Verwendet Hibernate pessimistisches oder optimistisches Sperren?

Alle meine Klassen haben eine

@Ausführung

anmerkung, also nahm ich an, dass sie optimistisches Sperren verwendeten.

Aber ich habe die folgende Ausnahme in meinen Protokollen, die darauf hindeuten, dass ich pessimistische Sperren verwende. Also was ist es? (Ich möchte optimistische Sperrung verwenden)

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
9
Paul Taylor

Sie verwenden optimistisches Sperren , wie Ihre UPDATE-Anweisung bereits anzeigt:

where recNo=? and version=?

Das Vorhandensein der Spalte version ist das Hauptanliegen des optimistischen Sperrens.

Sie wurden durch die PessimisticLockException in die Irre geführt, die möglicherweise durch eine explizite oder implizite Sperre auf Zeilenebene verursacht wurde.

Sie müssen verstehen, dass Sperren implizit für Zeilen erworben werden, um unsaubere Schreibvorgänge zu vermeiden. Dieses Buch erklärt dieses Thema mit vielen Diagrammen und Codebeispielen.

5
Vlad Mihalcea

Diese Ausnahme ist auf Lock TimeOut zurückzuführen.

Auslöser: org.h2.jdbc.JdbcSQLException: Timeout beim Sperren der Tabelle;

Prüfen Sie eine Lösung hier

Außerdem bietet der Ruhezustand Mechanismen zum Implementieren beider Sperrtypen in Ihren Anwendungen.

Ihre Sperrstrategie kann entweder optimistisch oder pessimistisch sein.

Optimistisch

Optimistisches Sperren setzt voraus, dass mehrere Transaktionen abgeschlossen werden können, ohne sich gegenseitig zu beeinflussen, und dass daher Transaktionen fortgesetzt werden können, ohne die betroffenen Datenressourcen zu sperren. Vor dem Festschreiben überprüft jede Transaktion, ob keine andere Transaktion ihre Daten geändert hat. Wenn die Prüfung widersprüchliche Änderungen ergibt, wird die festgeschriebene Transaktion zurückgesetzt [1].

Pessimistisch

Beim pessimistischen Sperren wird davon ausgegangen, dass gleichzeitige Transaktionen miteinander in Konflikt stehen. Außerdem müssen Ressourcen gesperrt werden, nachdem sie gelesen und erst entsperrt wurden, nachdem die Anwendung die Daten nicht mehr verwendet hat.

Details finden Sie hier

12
Macrosoft-Dev

Es ist sehr wahrscheinlich, dass Sie zum Testen eine andere Datenbank verwenden als in einer LIVE-Umgebung.

H2 kann zu Fehlern führen, die möglicherweise nicht in LIVE-Datenbanken wie Oracle, MySQL usw. auftreten. Bedeutet, dass sogar Ihr Code korrekt ist, der H2 jedoch möglicherweise herumspielt.

Das MVCC = true funktioniert einwandfrei. Gleichzeitig sollten Sie sicherstellen, dass Sie vollständige Integrationstests für LIVE-ähnliche Systeme für Ihren Anwendungsfall haben, um das Verhalten der LIVE-Datenbank zu überprüfen.

0
user3816944