-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: Oracle Sequence mit Hibernate 3.2.6:Sequenz kleiner als PKs
PostPosted: Wed Feb 16, 2011 9:25 am 
Newbie

Joined: Wed Feb 16, 2011 9:17 am
Posts: 2
HI,

Ich benutze Hibernate 3.2.6 als JPA-Implementation. Um PKs zu generieren, benutzen wir eine Oracle-Sequence, die alle PKs für alle Tabellen erzeugt. Wenn ich mir den nextVal von der Sequence ausgeben lasse, dann ist der sehr viel kleiner als der max(pk) in den meisten Tabellen. Der Unterschied ist - in der Regel, wir benutzen mehrere Instanzen unserer Applikation - ungefähr 1:10; soll heißen, die Sequenz gibt als nextVal 123,456 aus, dann ist der max(pk) etwa 1,234,xxx (etwa 10mal so groß).

Ich benutze keine spezifische Sequence Strategy, die pk-Spalten sind mit @GeneratedValue annotiert.

Die Applikation macht keine Schwierigkeiten, wir müssen nun aber auf DB-Ebene nachts eine Stored Proc laufen lassen, die nun ebenfalls Inserts in eine interne Log-Tabelle schreibt ... da liegt das Problem. Woher bekommt Hibernate seine PKs, was ist der Mechanismus? Ich hoffe, mich kann jemand auf die Sprünge helfen.

Viele Grüße,
Sebastian


Top
 Profile  
 
 Post subject: Re: Oracle Sequence mit Hibernate 3.2.6:Sequenz kleiner als PKs
PostPosted: Thu Feb 17, 2011 5:01 am 
Expert
Expert

Joined: Tue Jun 16, 2009 3:36 am
Posts: 990
Ich wuerde mir den Source-code der entsprechenden Hibernate-version runterladen und dann
die Klasse org.hibernate.id.SequenceGenerator durchlesen bzw. durchdebuggen.


Top
 Profile  
 
 Post subject: Re: Oracle Sequence mit Hibernate 3.2.6:Sequenz kleiner als PKs
PostPosted: Thu Feb 17, 2011 6:07 am 
Newbie

Joined: Fri Jan 07, 2011 7:23 am
Posts: 19
Ich weiß nicht, welcher Generator in 3.2 voreingestellt ist, aber ich vermute, das ist SequenceHiLoGenerator (siehe dazu auch http://opensource.atlassian.com/projects/hibernate/browse/HHH-3586).
Seit 3.6 gibt es neue Generatoren, z.B. speichert SequenceStyleGenerator zusammen mit PooledLoOptimizer tatsächlich die low-value in der Sequence, also das, was offensichtlich viele erwarten. (Bei diesem gibt es aber meiner Meinung nach ein Problem mit parallelem Zugriff: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5929)

Robin.


Top
 Profile  
 
 Post subject: Re: Oracle Sequence mit Hibernate 3.2.6:Sequenz kleiner als PKs
PostPosted: Mon Feb 28, 2011 3:27 am 
Newbie

Joined: Wed Feb 16, 2011 9:17 am
Posts: 2
pb00067 wrote:
Ich wuerde mir den Source-code der entsprechenden Hibernate-version runterladen und dann
die Klasse org.hibernate.id.SequenceGenerator durchlesen bzw. durchdebuggen.


Hi pb00067,

Vielen Dank erstmal für deine Antwort. Ich habe die Hibernate Klassen dekompiliert, und dort in der Klasse SequenceHiLoGenerator die Berechnung gefunden. Der Default-Wert für max_lo ist 9 (siehe http://blog.eyallupu.com/2011/01/hibernatejpa-identity-generators.html, und die Berechung ist SeqNumber*(max_lo+1), macht dann das 10-fache.

Da man den max_lo ja tunen kann, was ist denn ein vernünftiger Wert für eine Produktionsandwendung: 100, oder mehr?

Viele Grüße,
Sebastian


Top
 Profile  
 
 Post subject: Re: Oracle Sequence mit Hibernate 3.2.6:Sequenz kleiner als PKs
PostPosted: Fri Mar 04, 2011 7:20 am 
Expert
Expert

Joined: Tue Jun 16, 2009 3:36 am
Posts: 990
Es kommt darauf an, wie intensiv Deine Produktionsandwendung von verschiedenen Sessions aus gleichzeitig neue Entities erzeugt.
Gibt es haeufig Momente wo verschiedene Sessions gleichzeiting tausende neuer Entities erzeugen muessen,
dann kann es dazu kommen, dass sich die Sessions ein wenig ausbremsen, denn auf die Sequenz kann immer nur eine Session exclusiv zugreifen.
Im jedem 'normalen' Umfeld aber wuerde ich mal behaupten, dass 100 als max_lo vollkommen ausreicht.

Im Gegenzug haben viele Anwender Skrupel eine hoehere max_lo zu waehlen, in der Angst der Nummernkreis koennte wegen der grossen Zahlenluecken die entstehen koennen, ausgehen. Genauere Mathematische Hochrechnungen lassen diese Befuerchtungen aber meistens problemlos zerstreuen, also auch ein Wert von 32000 ist normalerweise ein praktikabler Wert fuer das max_lo.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.