Java 甲骨文序列-x27;增加';和';缓存&x27;

Java 甲骨文序列-x27;增加';和';缓存&x27;,java,oracle,hibernate,spring-boot,jpa,Java,Oracle,Hibernate,Spring Boot,Jpa,我在Spring boot应用程序中使用JPA和hibernate。在批量执行时,我面临一些插入性能问题。到目前为止,我发现的修复方法有: 更改Oracle序列将“增量更新为1,我给50” 在Java实体中,使用allocationSize将值设置为与Oracle增量相同的值 因此,JPA阻止调用获取下一个序列。 我的序列定义为: 创建序列MYSCM.BOOKING\u SCHED_SEQ增量1 MAXVALUE 9999999999999999999999999最小值1缓存20 当我将增量增加

我在Spring boot应用程序中使用JPA和hibernate。在批量执行时,我面临一些插入性能问题。到目前为止,我发现的修复方法有:

  • 更改Oracle序列将“
    增量更新为1,我给50”
  • 在Java实体中,使用
    allocationSize
    将值设置为与Oracle
    增量相同的值
  • 因此,JPA阻止调用获取下一个序列。 我的序列定义为:
    创建序列MYSCM.BOOKING\u SCHED_SEQ增量1 MAXVALUE 9999999999999999999999999最小值1缓存20

    当我将
    增量增加到50时,缓存应该增加到50还是减少

    当我将增量增加到50时,缓存应该增加到50还是减少

    都不是。增量和缓存之间没有关系

    增量BY控制序列的单调性。随着增量的增加50,序列依次为
    1、51、101、151
    ,依此类推

    缓存控制内存中保留多少序列号来服务下一个请求。缓存数量越小,数据库从其内部表读取数据以获取下一个分配范围的频率就越高。因此,在中等繁忙的系统中,我们希望将获取的锁存数量降至最低,因此我们将缓存设置为一个较高的数字,例如1000

    人们对设置缓存值非常着迷,因为他们认为如果缓存值太高,他们可能会“丢失”一些值,并且在序列中存在间隙。这是极不可能发生的,即使发生了,我们也不应该在意。序列是保证唯一值的来源,没有进一步的意义



    不过,在重新阅读您的问题后,我认为这不会对批量插入的性能产生任何影响。您为什么选择关注序列分配?您是否运行过跟踪以发现瓶颈在哪里?你和你的DBA谈过了吗

    对。大容量插入导致超时,因为正在为每个记录发出
    序列.nextval
    查询。我启用了批插入,这有助于提高一些性能,但这仍然是一个问题。您使用的是Oracle的哪个版本?我使用的是12C release 2Post对插入代码进行了剪切。最有可能的是,您所谓的批量插入根本就不是批量插入。我怀疑您正在为每行生成一个select和一个insert语句。解决方案是不限制为50行选择一个。您必须在封面下至少激活JDBC batch insert,才能在一次往返中插入一组行。@AlexandarPetrov-是的,数据库缓存序列