论坛首页 入门技术论坛

Jboss4.05+EJB3+oracle的实体操作非常之慢问题请教

浏览 4090 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-09  
Jboss4.05+EJB3+Oracle
现写了一个简单的BBS:
freemarker+struts2---->EJB3----->DB。
出现如下问题,
1、所有SQL语句在程序中运行时间都很长,长的不可思议,拿到数据库中直接执行(pl/sql developer)非常快,,说明语句是没问题的,
2、怀疑DB连接问题,netstat  -na观察服务器和客户端,都没问题,连接很正常。
3、怀疑JBOSS方面的配置问题,可单独写个例子,跑的欢的很,一点问题没有,速度奇快。
4、怀疑此程序问题,可此程序异常简单,
客户端是JSP,代码如下:
  	try { 
		ctx = new InitialContext(props);
    user = (Bbs_forumLocal)ctx.lookup("Bbs_forumBean/local");
Iterator i=user.getForumbyType("0","0").iterator();
while (i.hasNext())
{
	Bbs_forum f=(Bbs_forum) i.next();
	out.println(f.getForumname());
}
	} catch (Exception e) {
		e.printStackTrace(); 
		out.println(e.getMessage());
	}

会话Bean如下:
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
	public List<Bbs_forum> getForumbyType(boolean Type,String forumstatu) {
		// TODO 自动生成方法存根		
		return em.createQuery("select bf  from bbs_forum bf  where bf.forumtype=:Type and bf.forumstatu=:forumstatu").setParameter("forumstatu",forumstatu)
		.setParameter("Type", Type)
		.getResultList();		
	}

Entity非常简单,,数据库记录也就几十条。
找了一天了,实在找不出来原因,只知道用jprofile监控的情况就是下图,每调用一次,在这上面花了几秒钟...
下图的第一条sql 语句类似:  select  *  from  table as t1 inner table as t2 on t1.parentid=t2.id  where  t1.id=?
第二条语句是连接池探测用的,
第三条非常简单,无所谓
  • 描述: jprofile监控情况
  • 大小: 21.3 KB
   发表时间:2007-05-09  
1

怀疑是事务等待
写个例子测试一下事务正常不(不过时间太短不像)

2
引用

select * from table as t1 inner table as t2 on t1.parentid=t2.id where t1.id=?

换一个非关联语句试一下
可能是cache正在读关联表。关联信息?

3
      em.createQuery("select bf  from bbs_forum bf  where bf.forumtype=:Type and bf.forumstatu=:forumstatu").setParameter("forumstatu",forumstatu)  
       .setParameter("Type", Type)  
        .getResultList();
      em.createQuery("select bf  from bbs_forum bf  where bf.forumtype=:Type and bf.forumstatu=:forumstatu").setParameter("forumstatu",forumstatu)  
       .setParameter("Type", Type)  
        .getResultList();
      em.createQuery("select bf  from bbs_forum bf  where bf.forumtype=:Type and bf.forumstatu=:forumstatu").setParameter("forumstatu",forumstatu)  
       .setParameter("Type", Type)  
        .getResultList();
      em.createQuery("select bf  from bbs_forum bf  where bf.forumtype=:Type and bf.forumstatu=:forumstatu").setParameter("forumstatu",forumstatu)  
       .setParameter("Type", Type)  
        .getResultList();
return null;

换成这个看看是否时间会变成四秒?
0 请登录后投票
   发表时间:2007-05-09  
测试过,换个普通语句确实没问题,上面我就测试过,换个表,换个最普通的查询就没问题,不过有点我没想明白,这个语句我直接拿到oracle中运行只有45ms,在jboss中跑怎么就要2s钟了?
事务没问题,此问题,我已设置了不需要事务,但支持(改成SUPPORTS)事务方面很正常,数据库目前就一个在使用,不存在并发
按楼上兄弟的做法,复制了几份查询,,,所需时间还是那么多。
0 请登录后投票
   发表时间:2007-05-09  
wtb 写道
测试过,换个普通语句确实没问题,上面我就测试过,换个表,换个最普通的查询就没问题,不过有点我没想明白,这个语句我直接拿到oracle中运行只有45ms,在jboss中跑怎么就要2s钟了?
事务没问题,此问题,我已设置了不需要事务,但支持(改成SUPPORTS)事务方面很正常,数据库目前就一个在使用,不存在并发
按楼上兄弟的做法,复制了几份查询,,,所需时间还是那么多。
第二次是否会快一点?
有时实例初始化会慢一点
0 请登录后投票
   发表时间:2007-05-09  
不,,我刷新N次都是一样。
不过我找到一个原因之所在,,那就是我的关联比较复杂,有的地方用到了实体导航,引起大规模装载。。。
现在我把关联全改成:fetch = FetchType.LAZY,速度有所提升。
那这肯定是问题之一:
但是,我的问题又来了,
1、用LAZY,前台(freemarker)中不能导航了,非常不爽
2、不LAZY,前台能导航,可一时解决不了影响速度的问题。
以前用hibernaet的时候,使用open session in view,就轻松解决延迟加载又能实现导航功能。
但ejb3的实体生命周期在Bean的方法调用结束就结束了,如果关联是延迟加载,则无法实现导航,,不知道高人有何好的解决方法?,
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics