1

我已经使用hibernate框架开发了企业应用程序。当用户数量激增时(当用户数超过200时)应用程序挂起。我尝试了以下方法,但问题仍然存在。

1)C3PO连接池(之前没有使用连接池)

2)将休眠连接池大小增加到300(值100之前)

3) 将 getCurrentSession 方法更改为 openSession

hibernate.cfg.xml 文件有 connection.pool_size=300

大多数应用程序查询都使用此方法调用 -

@覆盖

公共列表getLovServiceSqlParam(字符串查询,对象[] obj){

    // TODO Auto-generated method stub
    Session session = null;
    if (this.getHibernateTemplate() != null && query != null
            && query.length() > 0) {

        try
        {
            session = this.getHibernateTemplate().getSessionFactory().openSession();
            SQLQuery query1 = session.createSQLQuery(query);

            for(int i=0;i<obj.length;i++)
            {
                query1.setParameter(i, obj[i]);
            }
            result = query1.list();
            session.close();
        }
        catch (DataAccessException e) {
            e.printStackTrace();
            throw e;
        }

        finally
        {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }

    }

    return result;
}
4

1 回答 1

0

这种情况不能通过查看代码来解决,而是通过$JAVA_HOME/bin/jvisualvm在负载下的应用程序上运行 cpu 采样工具(如 jvisualvm,免费并包含在 oracle JVM 包中,看那里:)。

查看您的 UI 线程将大部分时间花在哪里,并一个接一个地优化这些部分。

这可能是由于不再连接到数据库,或者是因为某些查询的争用,或者其他完全出乎意料的事情。只有运行 cpu 采样分析后您才会知道。

去做这个,

  • 将 jvisualvm 连接到负载下的应用程序(可能不容易获得与生产环境显示相同行为的环境,但可能更难让 jvisualvm 访问生产环境,具体取决于您工作的 IT 规则) ,
  • 切换到Sampler选项卡,然后单击CPU按钮,
  • 在你的 UI 上触发一个动作(通常这个动作应该有意外的行为(太慢了?))。
  • 完成后,单击Snapshot按钮。
  • 从那里找到您的 UI 线程(可能并不容易),然后查看它花费大部分时间的位置。
  • 优化这部分
于 2017-01-12T13:59:58.083 回答