应该是每个ejb都打开和关闭自己的数据库连接。
建议把EJB3的事务属性设置成NotSurport,应该可以避免刷新的问题。
顺便说一下,听起来EJB3的操作完全可以在EJB2的那个方法里面一起完成吗

解决方案 »

  1.   

    反对,jdbc建立数据库连接是很耗费资源(和执行查询比较),如果每个ejb都有自己的连接,会使系统很慢,应该使用连接池。
      

  2.   

    楼上的兄弟,如果楼主做过企业级的开发他自然会使用连接池的,但从编程着角度来说还是要从程序里面打开和关闭连接,连接池优化只是服务器提供的功能而已。没理由我打开一次连接就可以无止境地使用它:)。这也是我的一个疑问,因为如果数据库再一次正常操作后关闭了,就不应该报楼主说的那个问题,所以我怀疑楼主是用的一个数据库连接做的一系列操作:)。
    刚才的回复不知道有没有效,可能把事务属性设成Never更好一些
      

  3.   

    很对不起我写错了。是EJB1调用EJB2后再调用EJB3。太对不起了!!!!!
    EJB3不能在2中实现,因为3中的方法既要用到2的结果,又要用1中直接接收的参数。所以必须在1中调用2和3。
    另外,已经使用了连接池(thin),javabean中的连接方法就是
    ds=(DataSource)ctx.lookup("DataSource");
    conn=ds.getConnection();
    在EJB2调用了一次连接的方法,理论上就可以在在各处使用?可是我在EJB3中又生成了新的javabean的实例呀,所以只得再次连接,而且是每个方法里都进行连接和关闭。
    热切期盼着……@ @
      

  4.   

    这样做没错的,每次调用都打开和关闭连接。
    对那个错误,我还是建议把EJB3的事务属性改成Never,或者干脆把三个EJB的事务属性都改成Never好了。
      

  5.   

    我尝试按你的建议改属性,可是我发现我的工程中没有ejb-jar.xml文件,但是在工程的打包文件中有,可无法写,只能眼巴巴的看,怎么办?
    刚才趴在桌子上睡着了,所以来晚了……
      

  6.   

    没用jbuilder呀?那就解压出来,改完,在添加进包里面去:)
      

  7.   

    改好了添加进包
    winrar有add file...
      

  8.   

    改为了never。CreAndExeUpdateSql 是EJB2调用的EJB3中的一个方法。
    报错为下:
    javax.ejb.EJBException: Method CreAndExeUpdateSql is ed TX_NEVER, but was called within a transaction.
    我觉得不该是never,这样把的数据库操作排除在事务之外,违背了使用事务的初衷。你觉得呢?
      

  9.   

    解决了解决了!!!
    原来我把连接数据库的方法写在EJB3的create()中了,然后方法中就直接使用数据库操作的方法了。现在我在每个方法中都使用连接的方法,然后操作,然后关闭。就没问题了。可以多次刷新,出错也可以回滚。谢谢各位!
    各EJB属性仍用默认的require,不做改变。lzl123()接分啦。^o^
      

  10.   

    那么是不是可以这样说:如果EJB中有跨方法存在的数据库连接,就会出现刷新页面出错的问题?这个问题还有值得研究的地方。而且我始终觉得通过配置适当的事务属性可以避免那个事务问题的,我们用EJB不一定非要使用它的事务处理,否则事务属性怎么会有Never存在:)