今天使用了JPA的saveAll方法批量保存一千多条数据的问题,但是发现日志打印却是一条一条的insert语句。

查看saveAll的源码,发现里面是使用了一个for循环然后一条条的执行save方法....

好吧,手动写一个批量执行的方法

@Component

public class DbUtils {

private static EntityManager entityManager;

public static final int BATCH_SIZE = 1000;

public static EntityManager getEntityManager() {

if (entityManager == null) {

entityManager = SpringUtils.getBean(EntityManager.class);

}

return entityManager;

}

public static void setEntityManager(EntityManager entityManager) {

//DbUtils.entityManager = entityManager;

}

public static void batchExecute(String sql, List params, Integer batchSize){

if (batchSize == null) {

batchSize = BATCH_SIZE;

}

if(params.size() == 0){

return;

}

Connection conn = null;

Session session = null;

PreparedStatement stmt = null;

try {

session = (Session) getEntityManager().getDelegate();

SessionFactoryImpl sf = (SessionFactoryImpl)session.getSessionFactory();

conn = sf.getJdbcServices().getBootstrapJdbcConnectionAccess().obtainConnection();

stmt = conn.prepareStatement(sql);

conn.setAutoCommit(false);

int index = 0;

for (Object[] objects : params) {

for(int i=0 ; i

stmt.setObject(i+1, objects[i]);

}

stmt.addBatch();

index++;

if (index % batchSize == 0){

stmt.executeBatch();

stmt.clearBatch();

}

}

if (index % batchSize != 0){

stmt.executeBatch();

stmt.clearBatch();

}

conn.commit();

}catch (Exception e){

throw new RuntimeException(e.getMessage());

}finally {

try {

stmt.close();

conn.close();

}catch (SQLException e){

throw new RuntimeException(e.getMessage());

}

}

}

}

java jpa saveall方法优化_JPA批量保存saveAll的问题相关推荐

  1. java jpa saveall方法优化_JPA批量插入(saveAll)

    有时候要从第三方导入数据,一般量都比较大,除了方法用异步线程@Async之外,如果每条记录都调用一次save显然对数据库压力很大.可以使用JPA的批量保存方法saveAll(Iterable enti ...

  2. java jpa saveall方法优化_关于JPA saveAll()的一个小坑

    LBruce 你好: 其实想要解决 saveAll 批量插入慢的问题,我们需要两个步骤的操作.第一个步骤是非常简单的,因为 JPA 支持批量插入,所以,你可以设置一个批次执行多少条数据写入.例如,我们 ...

  3. java jpa性能_[Java Performance] 数据库性能最佳实践 - JPA和读写优化

    数据库性能最佳实践 当应用须要连接数据库时.那么应用的性能就可能收到数据库性能的影响. 比方当数据库的I/O能力存在限制,或者因缺失了索引而导致运行的SQL语句须要对整张表进行遍历.对于这些问题.只相 ...

  4. jpa批量保存,事务没提交_在事务外自动保存托管JPA实体

    jpa批量保存,事务没提交 Spring中的存储库和事务并存. Spring中的所有数据库访问都应在事务内运行,并且通常在某个地方使用@Transactional来强制执行此操作. 但是,这并不总是必 ...

  5. 第四天学习Java的笔记(方法入门,编译器优化)

    第三章 方法入门 方法:就是将一个功能抽取出来,将代码单独定义在一个大括号内,形成一个单独的功能.当我们需要这个功能的时候,就可以去调用,这样即实现了代码的复用性,也解决了代码冗余的现象. Demo1 ...

  6. word存为html图片有两个,如何批量保存Word图片?另存为Word多个图片的方法

    如何批量保存Word图片?很多用户在发送Word文档的时候都没有附上原图的习惯,导致接收方需要使用Word文档中的图片的时候还需要一个个另存为下载,当然,这是不明智的行为,如果你曾经历过这些,一定想知 ...

  7. 微信公众号文章批量保存到本地的方法

    其他不多说,直接入主题,目前比较常见的保存微信文章的方法有以下几种,简要分析如下: 1. 手动保存 微信登陆电脑客户端,用自带浏览器打开微信公众号文章,然后选择,复制,粘贴到Word里,进行保存. 这 ...

  8. java网页保存pdf_JavaScript+Java实现HTML页面转为PDF文件保存的方法

    JavaScript+Java实现HTML页面转为PDF文件保存的方法 发布于 2017-02-27 09:58:50 | 160 次阅读 | 评论: 0 | 来源: 网友投递 JavaScript客 ...

  9. java 网页保存为pdf文件怎么打开方式_js相关:JavaScript+Java实现HTML页面转为PDF文件保存的方法...

    js相关:JavaScript+Java实现HTML页面转为PDF文件保存的方法 发布于 2020-8-12| 复制链接 借助iText这个Java库,我们可以将HTML文件保存为图片文件进而转换成P ...

最新文章

  1. CentOS7 network
  2. 你也可以玩转Skype -- 基于Skype API开发外壳程序入门
  3. 《编码:隐匿在计算机软硬件背后的语言(美)》读书笔记三
  4. 本地安全沙箱最快解决办法
  5. Substring Removal
  6. 淘宝跨域获取Cookie分析
  7. C++20 即将于年底发布,C++ 23 提上日程!
  8. Debouncing circuit(消抖电路)
  9. LINUX重新编译BIN固件,固件编译
  10. wpsa3版面怎么变成a4、排版不变_怎么把wpsa3转变成a4
  11. 5G消息富媒体最新形态
  12. 综合布线系统 (布线系统的一种)
  13. 【系统分析师之路】系统分析师必知必会(需求分析篇)
  14. 然后是几点--编程题
  15. ecstore2.0数据库词典
  16. 身边策神 振江 刘盛义等等
  17. android root权限破解分析
  18. 停车场编码C语言,停车场系统部分C语言代码
  19. 回车和换行,以及不同软件对敲回车键的操作
  20. 法国 计算机 英语ppt,介绍法国的ppt(英语).ppt

热门文章

  1. scala 函数(柯理化)
  2. 好书推送-《代码不朽:编写可维护软件的10大要则》
  3. 不朽凡人 第一百六十二章 哪里来的外门弟子
  4. 小微支付平台,支付宝/微信聚合支付
  5. 港口与腹地码头间运输规划批判性文献综述
  6. Spring4.x❶ 两大核心之IOC
  7. 用ArcMap画一个彩虹风格的蜂窝
  8. (1)制作树莓派裸机操作系统
  9. 面试中如何去回答原型链这个问题的思考
  10. 【20保研】兰州大学信息科学与工程学院2019年优秀大学生暑期夏令营活动通知...