当前位置: 首页 > 知识库问答 >
问题:

JPA自定义JDBC批处理大小不起作用

柴丰
2023-03-14
EntityManager entityManager =  entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.unwrap(Session.class).setJdbcBatchSize(5);
        for(int i = 0;i<10;i++){
            Charge c = new Charge();
            c.setAccountNumber("acct"+i);
            entityManager.persist(c);
        }
entityManager.getTransaction().commit();



<bean id="entityManagerFactoryDefault" 
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="charg" />
        <property name="persistenceUnitName" value="MaterializedView" />
        <property name="persistenceXmlLocation" value="classpath*:META-INF/jpa-persistence.xml" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="generateDdl" value="false" />
                <property name="showSql" value="true"/> 
                <property name="database">
                    <util:constant static-field="org.springframework.orm.jpa.vendor.Database.ORACLE" />
                </property>
            </bean>
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.default_batch_fetch_size">500</prop>
                <prop key="hibernate.jdbc.fetch_size">10</prop>
                <prop key="hibernate.jdbc.batch_versioned_data">true</prop>
                <prop key="hibernate.order_updates">true</prop>
                <prop key="hibernate.order_inserts">true</prop>
                <prop key="hibernate.jdbc.batch_size">30</prop>
                <prop key="hibernate.id.new_generator_mappings">false</prop>
            </props>
        </property>

    </bean>

我得到以下查询:hibernate:select CHARGE.nextval from dual hibernate:insert into CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)Hibernate:插入到CHARGE(ACCOUNTNUMBER CHARGE_ID)值(?,?)

我使用Hibernate5.2.10.最终版本和序列作为策略。如果我的代码有错误,有人能纠正我吗

共有1个答案

鄂曦之
2023-03-14

Hibernate日志机制可能误导了您。很难看到JDBC批处理使用默认的Hibernate日志进行工作。

如果切换到datasource-proxy,则可以看到批处理正在工作:

Name:DATA_SOURCE_PROXY, Time:6, Success:True,
Type:Prepared, Batch:True, QuerySize:1, BatchSize:3,
Query:["insert into post (title, version, id) values (?, ?, ?)"],
Params:[(Post no. 0, 0, 0), (Post no. 1, 0, 1), (Post no. 2, 0, 2)]

batch:true参数显示JDBC捕获正在工作,batchsize:3参数显示在一个数据库往返中发送了一组参数值。

 类似资料:
  • 我用的是Kafka1.0,我增加了批量。大小=100K,用于优化我的制作人性能。但我发现,无论我设定的批次是什么,都没有任何效果。尺寸=100K或1000K或仅1K。此外,我还设定了我的逗留时间。ms=5,但这使性能更差。当我调试Kafka producer的源代码时,如下所示: 我发现了结果的价值。纽巴奇总是正确的,我想这就是为什么这一批。大小没有起任何作用,因为它每次都会唤醒发送者,而不是在b

  • 我在我的应用程序中使用Hibernate ORM和PostgreSQL,有时我使用批处理操作。起初我不明白为什么在批处理大小=25的日志中,会生成25个查询,起初我认为它不能正常工作。但是在那之后,我查看了pg驱动程序的源代码,在Pg语句类中发现了以下几行: 在PgPreparedStatement类中 我注意到,如果批处理的大小变为25,则会发送25个查询并附带参数。 数据库日志证实了这一点,例

  • 问题内容: 我有一个使用JDBC的Java应用程序,该应用程序每天在服务器上运行一次,并与也在同一服务器上运行的MySQL数据库(v5.5)进行交互。该应用程序正在查询并遍历表中的 所有 行。 该表目前很小(约5000行),但将无限期地增长。我的服务器内存有限,我不认为应用程序的内存消耗不确定。 如果我在运行查询之前使用过,我不清楚这里发生了什么。例如,如果我使用类似: 这是如何适当控制潜在的大型

  • 我有一个使用JDBC的Java应用程序,它每天在我的服务器上运行一次,并与同样在同一服务器上运行的MySQL数据库(v5.5)交互。该应用程序正在查询和遍历表中的所有行。 该表目前相当小(约5000行),但将无限期地继续增长。我的服务器内存有限,我不喜欢应用程序内存消耗不确定的想法。 如果我使用在运行查询之前,我不清楚这里发生了什么。例如,如果我使用以下内容: 这是如何适当地控制潜在的大型sele

  • 上下文 我们有一个批处理作业,可以将本地化的国家名称(即将国家名称翻译成不同的语言)从外部复制到我们的数据库中。其想法是将单个国家的所有本地化国家名称处理为一个区块(即第一区块-安道尔的所有翻译,下一区块-阿联酋的所有翻译,等等)。我们使用读取外部数据,一些oracle分析函数提供国家可用的翻译总数:比如 问题 因此,按块剪切这个输入看起来很简单:当您读取了中指定的确切行数时,停止块,并用下一个读

  • 问题内容: 我在应用程序中使用Hibernate ORM和PostgreSQL,有时我使用批处理操作。最初,我不明白为什么在批处理大小为25的日志中,会生成25个查询,并且最初认为它无法正常工作。但是之后,我查看了pg驱动程序的源代码,并在PgStatement类中找到了以下几行: 并在PgPreparedStatement类中 我注意到,事实证明,如果批处理的大小达到25,则会发送25个带有附加