gpt4 book ai didi

java - Hibernate - 插入非常慢

转载 作者:行者123 更新时间:2023-11-30 06:43:42 27 4
gpt4 key购买 nike

所以我尝试使用 Hibernate 插入 30000 条记录(最终的解决方案是插入 300000 条或更多记录)。我的问题是插入 300 条记录大约需要 8-9 秒,非常慢。数据库是Oracle。我尝试过批处理,但没有加速。

hibernate 配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
...
<property name="hibernateProperties">
<props>
<prop key="hibernate.max_fetch_depth">0</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.current_session_context_class">ch.nevis.estivate.util.TransactionAwareSessionContext</prop>
<prop key="javax.persistence.validation.mode">none</prop>
<prop key="hibernate.validator.autoregister_listeners">false</prop>
<prop key="hibernate.validator.apply_to_ddl">false</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>

<prop key="hibernate.jdbc.batch_size">30</prop>
<prop key="hibernate.order_inserts">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
</bean>

Java:

@Transactional
public class DataGenerator {

public void generate(int nr) {
System.out.println("START " + new Date());
int q = nr / 100;
Role role = (Role) sessionFactory.getCurrentSession().get(Role.class, new Long(4));
Client client = (Client) sessionFactory.getCurrentSession().get(Client.class, new Long(100));
Unit unit = (Unit) sessionFactory.getCurrentSession().get(Unit.class, new Long(100));
TemplateCollection templateCollection = (TemplateCollection) sessionFactory.getCurrentSession().get(TemplateCollection.class, new Long(100));
for(int i = 0; i < nr; i++) {
User user = generateUser(i, client, templateCollection);
sessionFactory.getCurrentSession().save(user);

Profile profile = generateProfile(i, user, unit, client);
sessionFactory.getCurrentSession().save(profile);

Authorization authorization = generateAuthorization(i, profile, role);
sessionFactory.getCurrentSession().save(authorization);

if (i % q == 0) {
System.out.println(i/q + " % " + new Date());
}
if (i % 10 == 0) { // the batch_size is 30 but I save 3 entities in one go
sessionFactory.getCurrentSession().flush();
sessionFactory.getCurrentSession().clear();
}
}
System.out.println("END " + new Date());
}

有什么提示吗?
也许 Hibernate 不适合加载很多记录?

谢谢,
五、

------------更新-------------
删除了自定义 session 上下文类(即正在使用 Spring 的 CurrentSessionContext),但没有加速。

------------更新2-------------

public static void main(String[] args) {
ApplicationContext ctx = new FileSystemXmlApplicationContext("file:/......./applicationContext-testDataGenerator.xml");
DataGenerator dataGenerator= ctx.getBean("dataGenerator", DataGenerator.class);
dataGenerator.generate(10000);
}

最佳答案

我认为你应该将冲洗部分移到循环之外并只执行一次。

这将加快您的代码速度。

batch_size 只是告诉 Hibernate 将多少个 SQL 命令组合在一起。

也许,增加batch_size来加快插入阶段。

关于java - Hibernate - 插入非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51840502/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com