java - hibernate5 类型配置注册表类中的内存泄漏
问题描述
最近,我们将 hibernate 5 与我们的应用程序集成,从 hibernate 3 升级它。
几个月后,我们开始在 hibernate 5 的类型配置注册表类中看到内存泄漏。
特别是在 registerTypeConfiguration 方法中创建新的并发 hashmap 时。
- 堆转储清楚地表明存在泄漏。
- 引导过程中该文件的内容表明它包含所有 dao 类。
- 这样一来,应该有一组 DAO 类在启动时注册并在关机时取消注册。
- 但它是在运行时引起的内存泄漏。是否有 DAO 类的重复副本?
我们使用 spring 的 localSessionFactoryBean 来与 hibernate 事务管理器集成。
根据 localSessionFactoryBean 文档,它与休眠 5 兼容,这与为什么存在泄漏的问题有关?
依赖项:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.23.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.9.Final</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>7.0.19</version>
</dependency>
配置:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource"
ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.cache.region.factory_class">
<<>>
</prop>
<prop key="hibernate.dialect">
<<>>
</prop>
</props>
</property>
</bean>
<bean id="txManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
解决方案
几个月前,我在工作中遇到了类似的问题(来自同一个班级的泄漏,但作为不同休眠工作流程的一部分)。事实证明,每当 Hibernate 创建 a 时,TypeConfiguration
它都会在内部将自身注册TypeConfigurationRegistry
到该文件中。我看到取消注册的唯一地方是作为会话工厂关闭回调的一部分,如此处所示。
我们使用SchemaExport
Hibernate API 和 HBM XML 语法。鉴于没有清除内置 Hibernate 缓存的“官方”方法,我们采用了一种解决方法来获取对内部状态的引用TypeConfigurationRegistry
并将其清除。
我知道,这不是最好的方法,但只是想把它放在那里,以防有人像我们一样处于类似的情况。
推荐阅读
- codepen - 在 CodePen 中更新 Pen 的内容时,我的 Pen 的缩略图不会更新
- php - PHP DOM $xpath->query 获取原始 HTML 作为输出
- azure - 如何使用 Cypress.io 使用 MS Active Directory 登录?
- flutter - Flutter如何在任意孩子上使用boxShadow?
- php - 将 Excel 字符串转换为 php 可读字符串
- qt - 必需的属性不适用于中继器
- java - 到 JsonObject 的 Java 字符串返回 null
- android - 为什么我的 android studio 设置卡在 Preparing “Install Android Emulator (revision: 30.0.12)”
- javascript - 在 React 中使用 Hooks 设置点击事件的时间间隔不会使用更新的状态值
- javascript - 根据下拉列表的值从单元格中提取数据