Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA:预分配ID块无法正常工作_Jpa_Eclipselink - Fatal编程技术网

JPA:预分配ID块无法正常工作

JPA:预分配ID块无法正常工作,jpa,eclipselink,Jpa,Eclipselink,我正在尝试使用allocationSize default通过注释@TableGenerator管理ID生成。据我所知,为了避免为每个被请求的标识符更新行,使用了分配大小。理论上,提供者应该预先分配一个等于allocationSize值的标识符块(在本例中为50),然后根据请求从内存中发出标识符,直到该块用完或事务结束 我在JBoss7.1中使用Eclipselink(EL) 问题是这种情况不会发生。在表Students中插入3条记录,EL为每条记录预先分配一个50 ID的块,即使事务是相同的。

我正在尝试使用allocationSize default通过注释@TableGenerator管理ID生成。据我所知,为了避免为每个被请求的标识符更新行,使用了分配大小。理论上,提供者应该预先分配一个等于allocationSize值的标识符块(在本例中为50),然后根据请求从内存中发出标识符,直到该块用完或事务结束

我在JBoss7.1中使用Eclipselink(EL)

问题是这种情况不会发生。在表Students中插入3条记录,EL为每条记录预先分配一个50 ID的块,即使事务是相同的。然后,对于每个记录,总是可以访问该表。从日志中,我看到3个预分配和3对ID的select/update查询,生成的ID为1-51-101,序列的最终值为150。一块原木

Connection acquired from connection pool
UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
bind => [50, TABLE_SEQ]
SELECT SEQ_COUNT FROM SEQUENCE WHERE SEQ_NAME = ?
bind => [TABLE_SEQ]
local sequencing preallocation for TABLE_SEQ: objects: 50 , first: 1, last: 50
Connection released to connection pool [default].

Connection acquired from connection pool
UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
bind => [50, TABLE_SEQ]
SELECT SEQ_COUNT FROM SEQUENCE WHERE SEQ_NAME = ?
bind => [TABLE_SEQ]
local sequencing preallocation for TABLE_SEQ: objects: 50 , first: 51, last: 100
Connection released to connection pool [default].
作为单个事务,我期望序列ID(1-2-3)和序列50的最终值。 我错在哪里?我试图在论坛上做研究,但我甚至不能解决这个问题。 下面是简单的测试代码。 谢谢你的帮助

实体学生

@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

编辑 @克里斯:谢谢你的回复

这是最好的原木。我只注意到一个主要的区别。对于每个插入,它将创建不同的连接。但是,如果首先运行@wypiperz建议的查询,则连接总是相同的

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 from 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 WHERE 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 to 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 + ? WHERE 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 FROM SEQUENCE WHERE 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 FROM SEQUENCE WHERE 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 for 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 to 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 to the 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 from 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 + ? WHERE SEQ_NAME = ?")
[EL Finest]: connection: 2014-04-26 18:05:14.328--ClientSession(1096067977)--Thread(Thread[EJB default - 1,5,EJB default])--reconnecting to 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 + ? WHERE 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 FROM SEQUENCE WHERE 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 FROM SEQUENCE WHERE 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 for 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 to 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 to the 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 from 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 + ? WHERE SEQ_NAME = ?")
[EL Finest]: connection: 2014-04-26 18:05:14.339--ClientSession(1096067977)--Thread(Thread[EJB default - 1,5,EJB default])--reconnecting to 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 + ? WHERE 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 FROM SEQUENCE WHERE 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 FROM SEQUENCE WHERE 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 for 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 to 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 to the 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 from connection pool [default].
[EL Finest]: connection: 2014-04-26 18:05:14.354--ClientSession(1096067977)--Thread(Thread[EJB default - 1,5,EJB default])--reconnecting to 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 INTO 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 INTO 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 INTO 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 to 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 to /127.0.0.1:65303
问题解决了。 为了更好地处理EclipseLink事务,is必须指定(在persistence.xml文件中)我们使用的服务器,在我的例子中:

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


以下查询返回的内容:
select*from SEQUENCE where SEQ_NAME='TABLE_SEQ'
?与前面一样,感谢您的回复。有什么我不明白的吗。我执行了您在每次查询之前告诉我的查询,并且成功了。按顺序(1-2-3)生成id,顺序为50。但是如果我删除了查询,我又会遇到问题。发生了什么事?显示的代码调用了manager.getTransaction().begin();和使用flush,但不提交事务,因此在垃圾回收时应该回滚。能否将EclipseLink日志设置为finest并显示为insertStudents方法生成的日志?使用日志发布更新。
<property name="eclipselink.target-server" value="JBoss"/>