一尘不染

Java Hibernate对分离对象进行不必要的查询

hibernate

我正在使用hibernate和c3p0connectionpool插入,更新和删除许多分离的对象。问题在于,hibernate不批处理语句,而是

select @@session.tx_read_only

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

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

select @@ session.tx_rad_only总是返回“0”(当然)。我使用无状态会话还是无状态会话都没有关系。最终的性能是不可接受的,并且超出了任何预期。

我的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服务器处于良好的配置状态。

edit1:我知道:Hibernate中不必要的查询 -MySql 我的实体中没有事务注释,也没有定义的隔离级别

edit2:我将我的connectionpool更改为bonecp-问题仍然存在。似乎显然是一个hibernate的配置问题。

edit3:尝试了许多不同的操作,并发现了一些提示:如果我每5次插入一次session.flush()(=批量大小)[从hibernate状态再次尝试了批量示例,则_选择@@session。tx_read_only_查询出现两次-每5个查询一次。因此,我假设 选择@@ session.tx_read_only
与冲洗有关。有什么方法可以防止hibernate刷新每个插入/更新?到目前为止,我尝试了:session.setFlushMode(FlushMode.COMMIT /NEVER/etc),而行为没有任何变化。也许我没有正确配置任何内容…hibernate触发什么来刷新每个插入内容?桌上的唯一约束?hibernate验证框架?复杂的对象图?并发困难吗?也许是锁定问题(Hibernate不确定其他人是否锁定了表并且不进行批处理,但是检查表是否为只读吗?)。

我没有发现与此极端(我认为)潮红行为有关的东西。


阅读 202

收藏
2020-06-20

共1个答案

一尘不染

我们只需在连接字符串中设置useLocalSessionState = true即可解决此问题。

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

2020-06-20