Проблема с кэшированием в спящем режиме - PullRequest
1 голос
/ 16 сентября 2011

Я имел дело с проблемами памяти в своем приложении и считаю, что наконец-то прибил его с помощью профилирования с помощью Yourkit - я кеширую пользователя в сеансе, но каждый кэшируемый User составляет 2 МБ, что создает много памяти при входе пользователей в систему и сохранении их сеансов:

Пользователи занимают 50% ОЗУ

Каждый пользовательский объект занимает 2 МБ, некоторые занимают 8 МБ

Когда я расширяю каждый класс, похоже, что вся память занята ассоциацией authorities, которая определяет роли пользователя: Расширенный класс в Yourkit

Вот XML Hibernate для соответствующих классов:

Пользователь:

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

Я полагал, что, поскольку таблица ролей кэширует пользователей (а в системе более 10 000 пользователей), результатом этого стал раздутый класс User, но удаление <cache usage="read-write"/> не помогло. Я не знаю слишком много о Hibernate, поэтому я не уверен, где я иду не так. Есть предложения?

Примечание: проект находится в Grails 1.3.7, и я использую (устарел) плагин acegi, если это помогает.

РЕДАКТИРОВАТЬ:

Я удалил обе ссылки на cache в наборе authorities, а также в Role. Объект на самом деле стал больше. Кроме того, в YourKit количество объектов для каждого пользователя составляет 10 900, что находится в пределах нескольких фактических пользователей в системе, поэтому он все равно должен их каким-то образом кэшировать. Мне нужно, чтобы это не было правдой!

1 Ответ

1 голос
/ 16 сентября 2011

Вместо того, чтобы отключать кеширование, настройте кеш так, чтобы меньше объектов и не кешировали их вечно, как это может показаться.См. «Кэш второго уровня» для получения подробной информации о том, как Hibernate использует кэш и как называются области кэша, чтобы вы знали, как изменить правильные настройки кэша.

Редактировать: Если подумать, основываясь на ваших комментариях, кэширование в Hibernate не является вашей проблемой.То, что вы описываете, это не то, как работает кэширование в Hibernate.Тот факт, что роль кэшируется, не означает, что все пользователи тоже кэшируются.Каждый тип объекта кэшируется независимо.Вам нужно искать где-то кроме кэширования второго уровня Hibernate.Вероятно, проблема заключается в том, что загрузка роли приводит к загрузке 10 тыс. Пользователей.Вы этого не хотите.Возможно, вы захотите взглянуть на «экстра-ленивую» выборку коллекции .Также проверьте в Yourkit, чтобы увидеть, что именно содержит ссылки на эти вещи, если что-нибудь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...