hibernate - hibernate 缓存问题

标签 hibernate caching memory grails spring-security

我一直在处理应用程序中的内存问题,并相信我最终通过对Yourkit进行分析来解决了这个问题-我在 session 中缓存了User,但是缓存的每个User都是2MB,这会在用户创建大量内存登录并保存其 session :

Users are taking up 50% of RAM

Each User Object is 2MB, some taking 8MB

当我扩展每个类时,似乎与authorities的关联占用了所有内存,该关联定义了用户的角​​色:Expanded Class In Yourkit

这是相关类的Hibernate XML:

用户:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.pps.domain" default-lazy="false">

    <class name="User" table="pps_users">
        <cache usage="read-write"/>
        <comment>User</comment>

        <id name="id" type="long">
            <generator class="native">
            </generator>
        </id>
 <set name="authorities" inverse="true" table="pps_user_roles" lazy="true">
            <cache usage="read-write"/>
            <comment>User - Roles Associations</comment>
            <key column="user_id"/>
            <many-to-many column="role_id" class="com.pps.domain.Role"/>
        </set>
    </class>

</hibernate-mapping>

角色:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.pps.domain" default-lazy="false">

    <class name="Role" table="pps_roles" lazy="true">
        <cache usage="read-write"/>
        <comment>Role</comment>

        <id name="id" type="long">
            <generator class="native">
            </generator>
        </id>

        <property name="description"/>
        <property name="authority"/>

        <set name="users" table="pps_user_roles" lazy="false">
            <cache usage="read-write"/>            
            <comment>User - Roles Associations</comment>
            <key column="role_id"/>
            <many-to-many column="user_id" class="com.pps.domain.User"/>
        </set>
    </class>


</hibernate-mapping>

我发现,由于Roles表正在缓存Users(系统中有10,000多名用户),因此膨胀的User类是这样做的结果,但是删除<cache usage="read-write"/>并没有帮助。我对Hibernate不太了解,所以我不确定哪里出了问题。有什么建议么?

注意:该项目位于Grails 1.3.7中,如果有帮助,我正在使用(不建议使用)acegi插件。

编辑:

我删除了cache集合以及authorities中对Role的引用。对象实际上变大了。同样,在YourKit中,每个用户的对象计数为10,900,这在系统中的实际用户数之内,因此仍然必须以某种方式对其进行缓存。我需要这不是真的!

最佳答案

与其关闭缓存,不如将缓存配置为允许更少的对象并且不永远缓存它们,这听起来好像在做。有关Hibernate如何使用缓存以及如何命名缓存区域的详细信息,请参见"The Second Level Cache",因此您知道如何更改正确的缓存设置。

编辑:再次考虑,基于您的评论,Hibernate缓存不是您的问题。您要描述的不是Hibernate中的缓存如何工作。缓存角色的事实并不意味着也缓存了所有用户。每种类型的对象都是独立缓存的。您需要查看除Hibernate二级缓存之外的其他地方。加载角色会导致1万名用户加载,这一事实可能就是问题所在。你不要那样您可能想看看"extra-lazy" collection fetching。另外,请检查Yourkit,以查看究竟是什么保留了对这些内容的引用(如果有)。

关于hibernate - hibernate 缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7438417/

相关文章:

java - JPA Hibernate 一对一关系

html - Chrome 没有清除缓存

java - spring mvc,maven,hibernate java.lang.ClassNotFoundException : com.实体.Candidate

html - 如何在 dragstart 之前缓存整个图层并将其还原回 dragend?

python - 枚举 Django 数据库缓存中的键

ios - 发送到已释放实例的消息导致加载 UITableView 崩溃

ios - 使用 NSURLSession.downloadTaskWithURL 时的内存泄漏

java - 如何通过 API 创建 Java 内存转储?

java - 使用hibernate一对多映射的not-found属性

mysql : why would I require AttributeConverter over enum to map a DB column having enum datatype as enum with a JPA entity?