2

我为我的网络应用程序使用托管(Struts + hibernate),

托管 java 内存限制:-XX:MaxPermSize=320m。

我的 Web 应用程序的每个用户都可以检索(仅从 DB 读取,不写入)每个 struts 操作的大量 Java bean - 最多 25 MB(MySQL 中的 number_of_records_in_DB * length_of_record_in_bytes)

用户可以同时使用我的 Web 应用程序(检索数据)

如何优化内存消耗?

我需要使用 Hibernate 兑现策略吗?

hibernate.cfg.xml :

<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">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property>

<property name="hibernate.show_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>

<property  name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory    </property>
<property name="hibernate.current_session_context_class">thread</property>

Hibernate Dao function :

public List<DataBean> listByPeriod(***) {

    **** 

    Session session = HibernateUtil.getSessionFactory().openSession();

    session.beginTransaction();

    Query query = session.createQuery(hql).setDate(0, date0).setDate(1, date1);  

    List<DataBean> data = null;

    try {
          data = (List<DataBean>)query.list();

    } catch (HibernateException e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    }

    session.getTransaction().commit();
    session.close();

    return data;
}

struts action + hibernate example :
String execute() {
    ***
    List<Databean> results = DataManager.listByPeriod(***); // size up to 25MB

    for (Iterator<Databean> it = results.iterator(); it.hasNext(); ) {
       doSomething();
       ***
    }
    ***
}
4

2 回答 2

1

如果此数据用于在页面上显示,请考虑使用分页并只读您真正需要使用的列。

更新
您可以尝试按照您的设想使用休眠缓存

于 2013-09-09T23:48:12.927 回答
1

Databean 是否具有 blob/clob 类型的属性,还是具有 List、Set 属性(一对多)?建议将它们设置为 Lazy 会减少内存使用量。

于 2013-09-10T02:52:51.523 回答