浏览 4090 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-09
现写了一个简单的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=? 第二条语句是连接池探测用的, 第三条非常简单,无所谓 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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; 换成这个看看是否时间会变成四秒? |
|
返回顶楼 | |
发表时间:2007-05-09
测试过,换个普通语句确实没问题,上面我就测试过,换个表,换个最普通的查询就没问题,不过有点我没想明白,这个语句我直接拿到oracle中运行只有45ms,在jboss中跑怎么就要2s钟了?
事务没问题,此问题,我已设置了不需要事务,但支持(改成SUPPORTS)事务方面很正常,数据库目前就一个在使用,不存在并发 按楼上兄弟的做法,复制了几份查询,,,所需时间还是那么多。 |
|
返回顶楼 | |
发表时间:2007-05-09
wtb 写道 测试过,换个普通语句确实没问题,上面我就测试过,换个表,换个最普通的查询就没问题,不过有点我没想明白,这个语句我直接拿到oracle中运行只有45ms,在jboss中跑怎么就要2s钟了?
第二次是否会快一点?事务没问题,此问题,我已设置了不需要事务,但支持(改成SUPPORTS)事务方面很正常,数据库目前就一个在使用,不存在并发 按楼上兄弟的做法,复制了几份查询,,,所需时间还是那么多。 有时实例初始化会慢一点 |
|
返回顶楼 | |
发表时间:2007-05-09
不,,我刷新N次都是一样。
不过我找到一个原因之所在,,那就是我的关联比较复杂,有的地方用到了实体导航,引起大规模装载。。。 现在我把关联全改成:fetch = FetchType.LAZY,速度有所提升。 那这肯定是问题之一: 但是,我的问题又来了, 1、用LAZY,前台(freemarker)中不能导航了,非常不爽 2、不LAZY,前台能导航,可一时解决不了影响速度的问题。 以前用hibernaet的时候,使用open session in view,就轻松解决延迟加载又能实现导航功能。 但ejb3的实体生命周期在Bean的方法调用结束就结束了,如果关联是延迟加载,则无法实现导航,,不知道高人有何好的解决方法?, |
|
返回顶楼 | |