你的con在作用结束以后,是否close了?
每次作用结束都有close连接,要用到时再连接getDB

解决方案 »

  1.   

    问题是  con = testbean.getDB();  //在这里就出现错误了
    只要一getDB就出问题
      

  2.   

    con = ds.getConnection(); 那应该是在调用这一句的时候出错的了.
    你不用Rmi在本地调用一下试试
      

  3.   

    connection不能作为EJB的参数或者返回值,因为它不能垮RMI连接数据库;另外也未必实现serializable接口
      

  4.   

    liulang203(火的冰点) :
    con = ds.getConnection(); 那应该是在调用这一句的时候出错的了.
    你不用Rmi在本地调用一下试试
    ********************************肯定没错,我放到jsp里边调试过的connection不能作为EJB的参数或者返回值,因为它不能垮RMI连接数据库;另外也未必实现serializable接口
    ********************************是否意味着我肯定不能通过SESSIONBEAN 返回一个CONNECTION对象了?
      

  5.   

    catch (Exception e1)
        {
             con=null;
             System.gc();
        }
    这个地方需要修改一下,如果抛出异常,System.gc()的频繁调用会使你的系统严重变慢。从提示信息可以看出来你没有手工关闭connection连接。try下面代码:
     public Connection getDB() {
        Connection con = null;
        try
        {
             //创建JNDI上下文
             Context ctx = new InitialContext();
             //获得数据源
             DataSource ds = (DataSource) ctx.lookup("java:/OracleDS");
             con = ds.getConnection();
        }catch(NamingException e){
          //....
        }catch(SQLException e){
          System.out.println("无法取得数据库连接");
        }
        return con;
      }  public static void free(Connection conn){
        try{
          if(conn!=null)
           conn.close();
        }catch(Exception e){
          conn=null;
          System.out.println("释放数据库连接失败!");
        }
      }  public static void free(Connection conn, Statement stm){
      try{
        if(stm != null){
          stm.close();
          stm=null;
        }
      }catch(SQLException ex){
      }
      try{
        if(conn != null){
          conn.close();
          conn=null;
        }
      }catch(SQLException ex){
      }
    }
      

  6.   

    而且为什么要这样做呢?直接把data logic放到第一个sessionbean里面不就行了吗?
      

  7.   

    catch (Exception e1)
        {
             con=null;
             System.gc();
        }
    这部分代码需要修改,con=null不代表con被释放。如果发生异常,System.gc()会使你的垃圾回收经常调用,严重影响性能。因为jboss不能自动释放Connection,所以你需要手工操作,try改称下面代码: public Connection getDB() {
        Connection con = null;
        try
        {
             //创建JNDI上下文
             Context ctx = new InitialContext();
             //获得数据源
             DataSource ds = (DataSource) ctx.lookup("java:/OracleDS");
             con = ds.getConnection();
        }catch(NamingException e){
          //.....
        }catch(SQLException e){
          System.out.println("无法取得数据库连接");
        }  
      return con;
      }
      public static void free(Connection conn){
        try{
          if(conn!=null)
           conn.close();
        }catch(Exception e){
          conn=null;
          System.out.println("释放数据库连接失败!");
        }
      }  public static void free(Connection conn, Statement stm){
      try{
        if(stm != null){
          stm.close();
          stm=null;
        }
      }catch(SQLException ex){
      }
      try{
        if(conn != null){
          conn.close();
          conn=null;
        }
      }catch(SQLException ex){
      }
    }
      

  8.   

    这是一个取得Connnection的sessionbean主要内容,绝对可行:
    private Connection conn;
    private ConnDb cnnDb;
    private final String dbJNDI = "java:/OracleDS";
    public void ejbRemove() {
       try{
              conn.close();
          }catch(Exception ex){
              ex.printStackTrace();
          }
    }private void getConnection() throws SQLException, NamingException {
       InitialContext ic = new InitialContext();
       DataSource ds = (DataSource) ic.lookup(dbJNDI);
       conn =  ds.getConnection();
    }public void ejbCreate() throws CreateException {
       try{
             getConnection();
             cnndb = new ConnDb(conn);//把conn传给另一个辅助Bean:ConnDb由它去做数据操作,
                                      注意出错了要关闭conn;
          }catch(Exception ex){
             throw new CreateException("ejbCreate Fail!");
          }
    }
      

  9.   

    ConnDb是一个JAVAbean吧,应该不是sessionbean,但是在sessionBEAN中怎么能调用javabean呢?
      

  10.   

    可是不够灵活啊,我想写个sessionbean返回connection ,让所有的数据库操作都调用它啊
      

  11.   

    public Connection getDB() {
        Connection con = null;
        try
        {
             //创建JNDI上下文
             Context ctx = new InitialContext();
             //获得数据源
             DataSource ds = (DataSource) ctx.lookup("java:/OracleDS");
             con = ds.getConnection();
        }catch (Exception e1)
        {
             con=null;
             System.gc();
        }
        return con;
      }
    ********************************************
    然后在同一个sessionbean我们通过getDB得到数据连接
    public ResultSet resultset(String sql)
    {
    try{
    Connection con=getDB();
    Statement stmt=con.createStatement();
    ResultSet rs=stmt.execute(sql);
    }catch(Exception eee){..........}
    return rs;
    }**********************************把这个函数作为外部调用接口
    public Vector ss(String sql,int i)
    {
        ResultSet rs=resultset(sql);
        Vector v=new Vector();
        int g=0;
        while(rs.next())
        {
             for(g=1;g<=i;g++)
             {
                v.addElement(rs.getString(g));
             }
        }
    return v;
    }*************************************
    好了,剩下就是在servlet中调用ss(sql,i),然后把Vector解开就OK,灵活,万能的,我一直都用它
      

  12.   

    果然不错,sanyo_rider的回答最好,我打算给100分,另一100给本贴的顶的人,请sanyo_rider到我开的另一贴拿分