JPA更新查询——为什么赢';我的交易不起作用吗?

JPA更新查询——为什么赢';我的交易不起作用吗?,jpa,eclipselink,derby,Jpa,Eclipselink,Derby,我在JavaDB(Derby)编写事务时遇到性能问题。每笔交易都需要500毫秒以上的时间,我一天可能有几十万笔。我希望在MySql上部署,我不知道是否会遇到同样的问题,但我正在尝试在尝试之前提高Derby的性能 一个事务涉及更新一系列记录——多达6条,如下所示: public void update(List<Tally> list) { try { utx.begin(); for (Tally tally : list) em.merge(

我在JavaDB(Derby)编写事务时遇到性能问题。每笔交易都需要500毫秒以上的时间,我一天可能有几十万笔。我希望在MySql上部署,我不知道是否会遇到同样的问题,但我正在尝试在尝试之前提高Derby的性能

一个事务涉及更新一系列记录——多达6条,如下所示:

public void update(List<Tally> list) {
    try {
        utx.begin();
        for (Tally tally : list) em.merge(tally);
        utx.commit();
    // etc
就是这样操作的:

@NamedQuery(name="TallyUpdate",
   query="UPDATE Tally t SET t.vote = t.vote + 1 WHERE t.id IN :idSet"
@PersistenceContext protected EntityManager   em;
@Resource           protected UserTransaction utx;    
public void incrementVote(List<Long> idList) {
    Query q = em.createNamedQuery("TallyUpdate");
    q.setParameter("idSet", idList);
    try {
        utx.begin();
        q.executeUpdate();
        utx.commit();
    //etc
JPA实现是EclipseLink 2.3.0

“色拉例外”这个词是什么意思?我应该如何运行更新

结果发布:我确实在utx.begin()调用之后将createnamedQuery()调用移动到了,更新开始工作。我不知道为什么,但我现在要带着它跑

关于相对表现还没有结果,但我上面的帖子是误导性的。计票时,计票方式大约是24票对36票,而不是6票。因此,有六个调用原始的update()方法(使用merge()),每个调用都有一个大约6条记录的列表。正是这组通话耗时超过500毫秒。如果计数表是空的,那么基准只有27毫秒,这是我想要看到的速度。当表格填充到50000行或更多行时,我看到的是500ms+数字

如果有人对我在这里发布的结果感兴趣,请发表评论


另外,这是一个在GlassFish下运行的JSF应用程序,而不是EJB。我不确定这是否与性能有关。

因为您有一个容器管理的实体管理器,我猜您已经将它注入了EJB。因为这种情况意味着事务由容器管理,也就是说,您不需要在代码中明确地启动它们。默认情况下,事务在EJB方法启动时开始,在该方法完成时结束。这是针对无状态EJB的。对于状态完整的EJB,事务可以跨越多个方法调用,并在调用EJB“destroy”方法时结束。因此,您应该决定:要么使用容器管理的实体管理器(一个注入EJB的实体管理器,正如您在这里所做的),让容器管理事务(通过JTA),要么创建一个应用程序管理的实体管理器,您自己在代码中处理事务

关于性能,Apache的人说Derby在生产、匹配、有时甚至在某些情况下超过MySQL和PostgreSQL方面都非常好,正如您在本Apache文档中看到的:

恕我直言,德比并不是世界闻名的表现。甚至本文档也显示,在某些情况下,Derby比MySQL慢得多。此外,Derby上的CPU使用率更高

我的建议是:在MySQL上进行概念验证,并在该数据库上进行基准测试。如果这就是你将在生产中使用的,那么在不同的数据库上对你的应用程序进行性能调整就没有多大意义了

SEVERE: javax.persistence.TransactionRequiredException: executeUpdate is not supported for a Query object obtained through non-transactional access of a container-managed transactional EntityManager
    at com.sun.enterprise.container.common.impl.QueryWrapper.executeUpdate(QueryWrapper.java:225)