eclipselink - JPA: Pre-allocate ID block not work fine -


i'm trying manage id generation through annotation @tablegenerator allocationsize default. understand it, avoid updating row every single identifier gets requested, allocation size used. in theory, provider should pre-allocate block of identifiers equal value of allocationsize - 50 in case - , give out identifiers memory requested until block used or transaction comes end.

i use eclipselink (el) jboss 7.1.

the problem not happen. inserting 3 records in table students, el pre allocates each record block of 50 id, if transaction same. then, each record, there access table. logs see 3 pre allocations , 3 pairs of select/update query id , ids generated 1- 51 -101 , sequence has final value 150. piece of log

connection acquired connection pool update sequence set seq_count = seq_count + ? seq_name = ? bind => [50, table_seq] select seq_count sequence seq_name = ? bind => [table_seq] local sequencing preallocation table_seq: objects: 50 , first: 1, last: 50 connection released connection pool [default].  connection acquired connection pool update sequence set seq_count = seq_count + ? seq_name = ? bind => [50, table_seq] select seq_count sequence seq_name = ? bind => [table_seq] local sequencing preallocation table_seq: objects: 50 , first: 51, last: 100 connection released connection pool [default]. 

being single transaction, expected sequential ids (1-2-3) , final value of sequence 50. wrong? tried research on forum can not solve problem. below simple test code. help.

entity student

@entity @table(name="students") public class student implements serializable {     private static final long serialversionuid = 4771385985502937621l;      @tablegenerator(name="table_seq")     @id @column(name="id_student") @generatedvalue(generator="table_seq")     private int idstudent;      private string name;      public int getidstudent() {         return idstudent;     }      public void setidstudent(int idstudent) {         this.idstudent = idstudent;     }      public string getname() {         return name;     }      public void setname(string name) {         this.name= name;     } } 

ejb

@stateless(name="ejbstudent") public class ejbstudent implements ejbstudentremote {     @persistencecontext(unitname="jpa_test")     private entitymanager manager;      public ejbstudent() {     }       @override     public void insertstudents()      {         manager.gettransaction().begin();          student student1 = new student();         student1.setname("anna");         manager.persist(student1);          student student2 = new student();         student2.setname("paolo");         manager.persist(student2);              student student3 = new student();         student3.setname("luigi");         manager.persist(student3);          manager.flush();     } } 

edit @chris response.

this finest log. noticed major difference. each insert, create different connection. however, if run query suggested @wypieprz first of persist, connection same.

invoking org.jboss.invocation.interceptorcontext$invocation.insertstudent     [el finer]: connection: 2014-04-26 18:05:14.228--serversession(320769650)--thread(thread[ejb default - 1,5,ejb default])--client acquired: 1096067977 [el finer]: transaction: 2014-04-26 18:05:14.236--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--acquire unit of work: 698749338 [el finest]: transaction: 2014-04-26 18:05:14.237--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--persist() operation called on: jpa.test.model.student@55cdaad2. [el finest]: connection: 2014-04-26 18:05:14.238--serversession(320769650)--connection(118375432)--thread(thread[ejb default - 1,5,ejb default])--connection acquired connection pool [default]. [el finest]: query: 2014-04-26 18:05:14.24--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--execute query datamodifyquery(name="table_seq" sql="update sequence set seq_count = seq_count + #prealloc_size seq_name = #seq_name") [el finest]: connection: 2014-04-26 18:05:14.242--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--reconnecting external connection pool [el fine]: sql: 2014-04-26 18:05:14.249--clientsession(1096067977)--connection(1243300871)--thread(thread[ejb default - 1,5,ejb default])--update sequence set seq_count = seq_count + ? seq_name = ?     bind => [50, table_seq] [el finest]: query: 2014-04-26 18:05:14.252--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--execute query valuereadquery(name="table_seq" sql="select seq_count sequence seq_name = #seq_name") [el fine]: sql: 2014-04-26 18:05:14.253--clientsession(1096067977)--connection(1243300871)--thread(thread[ejb default - 1,5,ejb default])--select seq_count sequence seq_name = ?     bind => [table_seq] [el finest]: sequencing: 2014-04-26 18:05:14.256--clientsession(1096067977)--connection(1243300871)--thread(thread[ejb default - 1,5,ejb default])--local sequencing preallocation table_seq: objects: 50 , first: 1, last: 50 [el finest]: connection: 2014-04-26 18:05:14.258--serversession(320769650)--connection(118375432)--thread(thread[ejb default - 1,5,ejb default])--connection released connection pool [default]. [el finest]: sequencing: 2014-04-26 18:05:14.259--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--assign sequence object (1 -> jpa.test.model.student@55cdaad2) [org.hibernate.validator.util.version] (ejb default - 1) hibernate validator 4.2.0.final [el finest]: transaction: 2014-04-26 18:05:14.325--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--persist() operation called on: jpa.test.model.student@59887d29. [el finest]: connection: 2014-04-26 18:05:14.326--serversession(320769650)--connection(265370795)--thread(thread[ejb default - 1,5,ejb default])--connection acquired connection pool [default]. [el finest]: query: 2014-04-26 18:05:14.327--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--execute query datamodifyquery(name="table_seq" sql="update sequence set seq_count = seq_count + ? seq_name = ?") [el finest]: connection: 2014-04-26 18:05:14.328--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--reconnecting external connection pool [el fine]: sql: 2014-04-26 18:05:14.329--clientsession(1096067977)--connection(1910900393)--thread(thread[ejb default - 1,5,ejb default])--update sequence set seq_count = seq_count + ? seq_name = ?     bind => [50, table_seq] [el finest]: query: 2014-04-26 18:05:14.331--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--execute query valuereadquery(name="table_seq" sql="select seq_count sequence seq_name = ?") [el fine]: sql: 2014-04-26 18:05:14.332--clientsession(1096067977)--connection(1910900393)--thread(thread[ejb default - 1,5,ejb default])--select seq_count sequence seq_name = ?     bind => [table_seq] [el finest]: sequencing: 2014-04-26 18:05:14.334--clientsession(1096067977)--connection(1910900393)--thread(thread[ejb default - 1,5,ejb default])--local sequencing preallocation table_seq: objects: 50 , first: 51, last: 100 [el finest]: connection: 2014-04-26 18:05:14.335--serversession(320769650)--connection(265370795)--thread(thread[ejb default - 1,5,ejb default])--connection released connection pool [default]. [el finest]: sequencing: 2014-04-26 18:05:14.336--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--assign sequence object (51 -> jpa.test.model.student@59887d29) [el finest]: transaction: 2014-04-26 18:05:14.337--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--persist() operation called on: jpa.test.model.student@20f5e794. [el finest]: connection: 2014-04-26 18:05:14.338--serversession(320769650)--connection(1882633843)--thread(thread[ejb default - 1,5,ejb default])--connection acquired connection pool [default]. [el finest]: query: 2014-04-26 18:05:14.338--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--execute query datamodifyquery(name="table_seq" sql="update sequence set seq_count = seq_count + ? seq_name = ?") [el finest]: connection: 2014-04-26 18:05:14.339--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--reconnecting external connection pool [el fine]: sql: 2014-04-26 18:05:14.34--clientsession(1096067977)--connection(402944403)--thread(thread[ejb default - 1,5,ejb default])--update sequence set seq_count = seq_count + ? seq_name = ?     bind => [50, table_seq] [el finest]: query: 2014-04-26 18:05:14.342--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--execute query valuereadquery(name="table_seq" sql="select seq_count sequence seq_name = ?") [el fine]: sql: 2014-04-26 18:05:14.343--clientsession(1096067977)--connection(402944403)--thread(thread[ejb default - 1,5,ejb default])--select seq_count sequence seq_name = ?     bind => [table_seq] [el finest]: sequencing: 2014-04-26 18:05:14.345--clientsession(1096067977)--connection(402944403)--thread(thread[ejb default - 1,5,ejb default])--local sequencing preallocation table_seq: objects: 50 , first: 101, last: 150 [el finest]: connection: 2014-04-26 18:05:14.346--serversession(320769650)--connection(1882633843)--thread(thread[ejb default - 1,5,ejb default])--connection released connection pool [default]. [el finest]: sequencing: 2014-04-26 18:05:14.347--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--assign sequence object (101 -> jpa.test.model.student@20f5e794) [el finer]: transaction: 2014-04-26 18:05:14.348--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--begin unit of work flush [el finest]: query: 2014-04-26 18:05:14.351--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--execute query insertobjectquery(jpa.test.model.student@59887d29) [el finest]: connection: 2014-04-26 18:05:14.353--serversession(320769650)--connection(1582457600)--thread(thread[ejb default - 1,5,ejb default])--connection acquired connection pool [default]. [el finest]: connection: 2014-04-26 18:05:14.354--clientsession(1096067977)--thread(thread[ejb default - 1,5,ejb default])--reconnecting external connection pool [el fine]: sql: 2014-04-26 18:05:14.354--clientsession(1096067977)--connection(1927398752)--thread(thread[ejb default - 1,5,ejb default])--insert students (id_student, name) values (?, ?) bind => [51, paolo]  [el finest]: query: 2014-04-26 18:05:14.37--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--execute query insertobjectquery(jpa.test.model.student@55cdaad2) [el fine]: sql: 2014-04-26 18:05:14.371--clientsession(1096067977)--connection(1927398752)--thread(thread[ejb default - 1,5,ejb default])--insert students (id_student, name) values (?, ?)     bind => [1, anna] [el finest]: query: 2014-04-26 18:05:14.373--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--execute query insertobjectquery(jpa.test.model.student@20f5e794) [el fine]: sql: 2014-04-26 18:05:14.373--clientsession(1096067977)--connection(1927398752)--thread(thread[ejb default - 1,5,ejb default])--insert students (id_student, name) values (?, ?)     bind => [101, luigi] [el finer]: transaction: 2014-04-26 18:05:14.375--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--end unit of work flush [el finer]: transaction: 2014-04-26 18:05:14.376--unitofwork(698749338)--thread(thread[ejb default - 1,5,ejb default])--resume unit of work exiting org.jboss.invocation.interceptorcontext$invocation.insertstudent business method insertstudent in org.jboss.invocation.interceptorcontext$invocation takes 5878 ms execute 18:05:14,409 info  [org.jboss.as.naming] (remoting "pc" task-1) jbas011806: channel end notification received, closing channel channel id 03cefe33 (inbound) of remoting connection 3138554d /127.0.0.1:65303 

problem solved. in order work eclipselink transactions, must specify (in persistence.xml file) server using, in case:

<property name="eclipselink.target-server" value="jboss"/> 

Comments

Popular posts from this blog

java - Intellij Synchronizing output directories .. -

git - Initial Commit: "fatal: could not create leading directories of ..." -