Hibernate web应用程序
我使用hibernate框架开发了企业应用程序。当用户数量激增时(当用户数超过200时),应用程序会挂起。我尝试了以下方法,但问题仍然存在 1) C3PO连接池(以前未使用连接池) 2) 将hibernate连接池大小增加到300(值100之前) 3) 将getCurrentSession方法更改为openSession hibernate.cfg.xml文件具有 连接。池大小=300 大多数应用程序查询都是使用此方法调用的- @凌驾 公共列表getLovServiceSqlParam(字符串查询,对象[]obj){Hibernate web应用程序,hibernate,hibernate-postgresql,Hibernate,Hibernate Postgresql,我使用hibernate框架开发了企业应用程序。当用户数量激增时(当用户数超过200时),应用程序会挂起。我尝试了以下方法,但问题仍然存在 1) C3PO连接池(以前未使用连接池) 2) 将hibernate连接池大小增加到300(值100之前) 3) 将getCurrentSession方法更改为openSession hibernate.cfg.xml文件具有 连接。池大小=300 大多数应用程序查询都是使用此方法调用的- @凌驾 公共列表getLovServiceSqlParam(字符串查
//TODO自动生成的方法存根
会话=空;
如果(this.getHibernateTemplate()!=null&&query!=null
&&query.length()>0){
尝试
{
会话=this.getHibernateTemplate().getSessionFactory().openSession();
SQLQuery query1=session.createSQLQuery(查询);
对于(int i=0;i这种情况不是通过查看代码来解决的,而是通过在加载的应用程序上运行cpu采样工具(如jvisualvm,免费的,包含在oracle JVM包中,请看:$JAVA_HOME/bin/jvisualvm
)来解决的
看看你的UI线程大部分时间都花在哪里,然后一个接一个地优化这些部分
这可能是由于不再连接到数据库,或者由于某些查询上的争用,或者完全出乎意料的其他原因。只有在运行cpu采样分析后,您才会知道
为此,
- 将jvisualvm连接到负载下的应用程序(可能不容易获得显示与生产环境相同行为的环境,但更难获得对生产环境的jvisualvm访问,具体取决于您工作的it规则)
- 切换到
Sampler
选项卡,然后单击CPU
按钮
- 在你的UI上触发一个动作(通常这个动作会有意外的行为(太慢?)
- 完成后,单击快照按钮
- 从那里找到你的UI线程(可能不容易),然后看看它在哪里花费了大部分时间
- 优化这部分
这种情况不是通过查看代码来解决的,而是通过在加载的应用程序上运行cpu采样工具(如jvisualvm,免费,包含在oracle JVM包中,请看:$JAVA\u HOME/bin/jvisualvm
)来解决的
看看你的UI线程大部分时间都花在哪里,然后一个接一个地优化这些部分
这可能是由于不再连接到数据库,或者由于某些查询上的争用,或者完全出乎意料的其他原因。只有在运行cpu采样分析后,您才会知道
为此,
- 将jvisualvm连接到负载下的应用程序(可能不容易获得显示与生产环境相同行为的环境,但更难获得对生产环境的jvisualvm访问,具体取决于您工作的it规则)
- 切换到
Sampler
选项卡,然后单击CPU
按钮
- 在你的UI上触发一个动作(通常这个动作会有意外的行为(太慢?)
- 完成后,单击快照按钮
- 从那里找到你的UI线程(可能不容易),然后看看它在哪里花费了大部分时间
- 优化这部分
我尝试过这样做,但线程分析太复杂。在应用程序挂起的情况下,根本不会从action类调用getNamedQuery方法。getNamedQuery方法之前的sysout将打印在日志中,但方法中的其他sysout根本不会打印,即getNamedQuery不会执行,因此结果不会被渲染ied正在这样做,但线程分析太复杂。在应用程序挂起的情况下,根本不会从action类调用getNamedQuery方法。getNamedQuery方法之前的sysout正在日志中打印,但该方法内部的其他sysout根本不会打印,即getNamedQuery不会执行,因此不会呈现结果
// 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;
}