gpt4 book ai didi

java Hibernate 对分离对象的不必要查询

转载 作者:可可西里 更新时间:2023-11-01 07:02:35 25 4
gpt4 key购买 nike

我正在使用 hibernate 和 c3p0 连接池插入、更新和删除许多分离的对象。问题是 hibernate 不批处理语句而是执行一个

select @@session.tx_read_only

在每个 session.persist/insert/update/delete(object) 之间。分析 sql 连接看起来像这样:

select @@session.tx_read_only
insert...
select @@session.tx_read_only
insert...
select @@session.tx_read_only
insert...
select @@session.tx_read_only
insert...
select @@session.tx_read_only
insert...
select @@session.tx_read_only

选择@@session.tx_rad_only 总是返回“0”(当然)。我使用无状态 session 还是有状态 session 并不重要。由此产生的性能是 Not Acceptable ,远未达到预期。

我的 Hibernate 配置:

 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:4040/xy?zeroDateTimeBehavior=convertToNull</property>
<property name="hibernate.connection.username">xy</property>
<property name="hibernate.connection.password">xy</property>
<property name="hibernate.connection.autocommit">false</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.format_sql">false</property>
<property name="hibernate.use_sql_comments">false</property>
<property name="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory</property>
<property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">250</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.jdbc.batch_size">250</property>
<property name="hibernate.connection.release_mode">auto</property>
<property name="hibernate.order_inserts">true</property>
<property name="hibernate.order_updates">true</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="net.sf.ehcache.configurationResourceName">hibernate_ehcache.xml</property>

我正在使用:

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>4.3.5.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>ejb3-persistence</artifactId>
<version>1.0.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.3.4.Final</version>
</dependency>

我几乎没有使用 hibernate 的经验,很可能我犯了一个大错误,所以请随时提出任何建议。我切换到 hibernate 是因为 ORM 功能,并且来自普通的 jdbc 准备好的语句,具有极快的性能。 MYSQL 服务器处于良好的配置状态。

编辑1:我知道: Unnecessary queries in Hibernate - MySql我的实体中没有事务注释,也没有任何地方定义的隔离级别

编辑2:我将连接池更改为 bonecp - 问题仍然存在。似乎显然是 hibernate 配置问题。

编辑3:尝试了很多不同的东西,也许发现了一丝暗示:如果我每 5 次插入一次手动 session.flush()(= 批处理的大小,例如)[再次尝试从 hibernate 中使用批处理示例],select @@session.tx_read_only 查询出现两次 - 每 5 次查询.因此,我假设 select @@session.tx_read_only 与刷新有关。有什么方法可以防止 hibernate 刷新每一个插入/更新?到目前为止,我尝试过:session.setFlushMode(FlushMode.COMMIT/NEVER/etc) 行为没有任何变化。也许我配置错误了…… hibernate 会触发什么来刷新每个插入?表中的唯一约束? hibernate 验证框架?复杂的对象图?难并发?可能是一个锁定问题(Hibernate 不确定是否有人锁定了表并且不批处理但如果表是只读的则检查每个插入?)?

我没有发现与这种极端(我假设)潮红行为有关。

最佳答案

我们通过在连接字符串中设置 useLocalSessionState=true 解决了这个问题。

下面的链接解释了从 Mysql5.6 和 java 连接器 5.1.23 发生的 ReadOnly 相关更改的详细信息。 http://dev.mysql.com/doc/relnotes/connector-j/en/news-5-1-23.html

关于java Hibernate 对分离对象的不必要查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24563385/

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