Database EclipseLink不工作时的批量插入

Database EclipseLink不工作时的批量插入,database,postgresql,jpa,jdbc,eclipselink,Database,Postgresql,Jpa,Jdbc,Eclipselink,我正在Amazon RDS数据库实例中使用EclipseLink-2.6.1。以下代码用于将新实体插入数据库: tx = em.getTransaction(); tx.begin(); for (T item : persistCollection) { em.merge(item); } tx.commit(); 正在持久化的对象具有复合主键(不是生成的主键)。在本地,查询运行速度非常快,但当插入

我正在Amazon RDS数据库实例中使用EclipseLink-2.6.1。以下代码用于将新实体插入数据库:

 tx = em.getTransaction();
 tx.begin();
 for (T item : persistCollection) {     
     em.merge(item);               
 }                 
 tx.commit();
正在持久化的对象具有复合主键(不是生成的主键)。在本地,查询运行速度非常快,但当插入远程数据库时,它的处理速度非常慢(大约慢20倍)。我曾尝试实现JDBC批处理编写,但没有成功(
eclipseelink.JDBC.batch writing
rewriteBatchedStatements=true
)。当记录正在执行的查询时,我只看到大量的选择,而不是一次插入(选择可能在这里,因为首先分离对象)

我的问题是如何处理这个问题?(我希望进行批处理编写,然后查看性能如何变化,但非常感谢任何帮助)

谢谢大家!

编辑:

当使用
em.persist(item)
循环几乎立即完成,但在
tx.commit()
之后,有很多(我猜每个持久化的项)查询,如:

[EL Fine]: sql: ServerSession(925803196) Connection(60187547) SELECT NAME FROM TICKER WHERE (NAME = ?), bind => [AA]

我的型号与
ticker\u name
@ManyToOne
关系。为什么又有这么多慢的SELECT查询?

merge需要新的和分离的实例,它必须查询数据库以确定是否需要插入或更新,并且只有在发生更改时才会更新。如果有选择但没有插入,那是因为这些是现有的、分离的项,与数据库中的项没有更改。如果您确定它们是新的(或只是想成为新的),请改为调用persist。提供程序不需要select调用,而是批量插入所有传入的项。我猜你会得到一个例外,尽管如上所述-出于某种原因,这些都不是新的。@Chris我已经用eclipselink日志更新了我的问题,从使用persist开始。性能没有提高(循环完成得很快,但新的SELECT查询速度很慢),这个查询来自哪里,因为我怀疑每次都有一个进程以某种方式触发查询。