gpt4 book ai didi

hibernate - hibernate 缓存问题

转载 作者:行者123 更新时间:2023-12-02 14:46:53 24 4
gpt4 key购买 nike

我一直在处理应用程序中的内存问题,并相信我最终通过对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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com