我正在使用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不确定其他人是否锁定了表并且不进行批处理,但是检查表是否为只读吗?)。
我没有发现与此极端(我认为)潮红行为有关的东西。
我们只需在连接字符串中设置useLocalSessionState = true即可解决此问题。
以下链接详细说明了Mysql5.6和java连接器5.1.23中发生的ReadOnly相关更改的详细信息。 http://dev.mysql.com/doc/relnotes/connector-j/en/news-5-1-23.html