当前位置: 首页 > 面试题库 >

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

钱季
2023-03-14
问题内容

我正在使用hibernate和c3p0 connectionpool插入,更新和删除许多分离的对象。问题在于,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”(当然)。我使用无状态会话还是无状态会话都没有关系。最终的性能是不可接受的,并且超出了任何预期。

我的休眠配置:

 <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>

我几乎没有冬眠的经历,这是一个很好的猜测,我犯了一个很大的错误,请随时提出任何建议。我之所以转为休眠,是因为ORM功能来自简单的jdbc准备好的语句,具有出色的快速性能。MYSQL服务器处于良好的配置状态。

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

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

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

我没有发现与此极端现象(我认为)有关的冲洗行为。


问题答案:

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

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



 类似资料:
  • 问题内容: JAXB很棒,可以节省时间,但是遍历结果对象树仍然很耗时。几乎和直接使用DOM一样糟糕。 有没有一种方法可以使我在JAXBElement上执行XPath 1.0查询,而不必每次都在DOM模型之间进行繁琐的编组? 问题答案: 不直接,不。但是,您可以使用Apache Commons Jxpath ,它允许您跨任意对象图运行XPath查询,而不仅限于与JAXB绑定的图。它可以在“宽容”模式

  • 我有一个关于KML中的组的问题。 我有一个数据集,由50个对象组成。这些对象具有属性,即F.E严重性。有没有可能根据这些严重性类对我的KML文档进行分类?(1/1.5/2)还是基于任何其他属性?我已经手动创建了文件夹,但数据集越大,工作量就越大...我也想为对象着色,基于分类。附上我将添加我的文档。也许有人知道如何处理这件事?

  • 问题内容: 给出: 给出: 是否有准备使用的库/代码来完成它? 问题答案: 您将无法使用JSON.stringify序列化事件对象,因为事件对象包含对DOM节点的引用,并且DOM在各处都有循环引用(例如,子/父关系)。JSON默认情况下无法处理这些,因此您有点不走运。

  • 我试图通过使用类将模板文档替换为Apache。我在doc和文件中有标记来读取替换数据。我的问题是,当我将的扩展名更改为文件并打开时,中的文本行似乎以某种方式分开。例如,文本分别变为和。以相同的方式读取,因为原始文件是这样的。这将在段落中创建2个对象,分别将文本显示为和。 我的问题是,是否有一种方法可以通过合并相关的运行或类似的方式强制像Word一样运行?或者我该如何解决这个问题?我在替换时匹配运行

  • 我有一个过程对象列表,如下所示 我的程序课就像 我想基于以下条件对对象进行排序和分组。 应根据过程名称对所有过程进行分组。 过程必须按过程日期降序排列。[日期列表中的第一个元素,即 分组在一起的相同过程应按日期降序排列。 最终结果必须是, 我能够使用比较器和旧的Java代码实现这一点。是否可以使用java8流、收集器和分组来实现相同的功能?