【发布时间】:2018-08-21 11:06:22
【问题描述】:
我的 Spring Boot 应用程序在插入数据时性能非常慢。
我正在从一个数据库中提取大量数据子集并将数据插入到另一个数据库中。
以下是我的实体。
@Entity
@Table(name = "element")
public class VXMLElementHistorical {
@Id
@Column(name = "elementid")
private long elementid;
@Column(name = "elementname")
private String elementname;
Getter/Setter methods...
我已经配置了一个 JPA 存储库
public interface ElementRepository extends JpaRepository<Element, Long> {
}
并用我的对象调用 save() 方法
@Transactional
public void processData(List<sElement> hostElements)
throws DataAccessException {
List<Element> elements = new ArrayList<Element>();
for (int i = 0; i < hostElements.size(); i++) {
Element element = new Element();
element.setElementid(hostElements.get(i).getElementid());
element.setElementname(hostElements.get(i).getElementname());
elements.add(element);
}
try{
elementRepository.save(elements);{
//catch etc...
}
发生的情况是,对于每个项目,执行插入需要 6 到 12 秒。我打开了休眠跟踪记录和统计,当我调用保存函数时发生的事情是休眠执行两个查询,一个选择和一个插入。选择查询占用了总时间的 99%。
我已直接在数据库上运行选择查询,结果以纳秒为单位返回。这让我相信这不是索引问题,但我不是 DBA。
我在我的开发环境中创建了一个负载测试,并且在负载大小相似的情况下,总的处理时间远不及我的生产环境中的时间。
有什么建议吗?
【问题讨论】:
-
我们在项目中使用spring data jpa,插入元素从未如此耗时。可能,根本原因与spring data jpa不同
-
首先你不应该转换,把它放在一个列表中,然后保存所有元素。您已经有效地复制了所有元素(这将增加内存)。此外,您在一笔大交易中做所有事情,这也会导致问题。相反,直接保存创建的元素和每个 x 元素(比如 50)你做一个
flush和clear。最好您还将刷新模式设置为手动(以防止脏检查和刷新)。
标签: java spring hibernate spring-boot spring-data-jpa