首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

[200分]通过以下DAO操作proxool连接池访问量大的时候,老是有有关问题?DAO如下

2012-02-01 
[200分]通过以下DAO操作proxool连接池访问量大的时候,老是有问题?DAO如下:通过以下DAO操作proxool连接池访

[200分]通过以下DAO操作proxool连接池访问量大的时候,老是有问题?DAO如下:
通过以下DAO操作proxool连接池访问量大的时候,老是有问题?DAO如下:
import   java.sql.Connection;
import   java.sql.DriverManager;
import   java.sql.PreparedStatement;
import   java.sql.ResultSet;
import   java.sql.SQLException;
import   java.sql.Statement;
import   java.util.ArrayList;
import   java.util.List;
import   java.sql.CallableStatement;

public   final   class   DAO   implements   DBsource,DAO
{
    private   static   Connection   conn=null;
    private   Statement   st=null;
    ResultSet   rs=null;
    PreparedStatement   ps=null;
    CallableStatement   cs=null;
 
    public   DAO()
    {
    }
    static{
        try{
        Class.forName( "org.logicalcobwebs.proxool.ProxoolDriver ");
        }catch(Exception   ex){
            ex.printStackTrace();
        }
    }
    private     void   getConn()
    {
            try{
            conn   =   DriverManager.getConnection( "proxool.xml-test ");
                    //conn   =   DriverManager.getConnection(Url,   username,   password);
                    //conn.setAutoCommit(false);//支持事务
                }catch   (Exception   ex){
                    ex.printStackTrace();
                }
    }
    //负责建立状态通道
    private   Statement   getStatement(){
        try   {
            if(conn==null||conn.isClosed())
            {
                getConn();
            }
              st   =   conn.createStatement();
              if(st==null)
              {
              st=getStatement();
              }
        }catch   (SQLException   ex)   {
            ex.printStackTrace();
        }
        return   st;
    }
    //
    public   boolean   doBatch(List   SQLs){
        boolean   is=false;
        getStatement();
        try{
            for(int   i=0;i <SQLs.size();i++){
                st.addBatch(SQLs.get(i).toString());
            }
            int[]   a=st.executeBatch();
//             for(int   i=0;i <a.length;i++){


//                 //System.out.println(a[i]+ "记录 ");
//             }
            is=true;
            //conn.commit();
        }catch(SQLException   ex)   {
            ex.printStackTrace();
            //conn.rollback();
        }finally{
            Close();
            return   is;
        }
    }
    //下面是使用预通道的通用方法
    public   ResultSet   execQuery(String   sql,String[]   args){
        try   {
            if(conn   ==   null   ||   conn.isClosed())   {
                  getConn();
                  ps=conn.prepareStatement(sql);
                  for(int   i=1;i <=args.length;i++){
                      ps.setString(i,args[i-1]);
                  }
                  rs=ps.executeQuery();
            }
        }catch   (SQLException   ex)   {
            ex.printStackTrace();
        }
          return   rs;
    }
    public   ResultSet   execQuery(String   sql,List   args)
    {
        try   {
            if(conn   ==   null   ||   conn.isClosed())   {
                  getConn();
                  ps=conn.prepareStatement(sql);
                  if(ps==null)
                  {
                getConn();
                ps=conn.prepareStatement(sql);  
                  }
                  if(args!=null)
                  {
                    for(int   i=1;i <=args.size();i++)
                    {
                      ps.setString(i,args.get(i-1).toString());
                    }
                  }
                  rs=ps.executeQuery();
            }
        }catch   (SQLException   ex)   {
            ex.printStackTrace();
        }


          return   rs;
    }
    public   boolean   execOperate(String   sql,String[]   args)
    {
        boolean   isCorrect=false;
        try   {
            if(conn==null||conn.isClosed())getConn();
            ps=conn.prepareStatement(sql);
            for(int   i=1;i <=args.length;i++){
          Object   Objvalue=args[i-1];
          if(Objvalue==null)
                  ps.setString(i,null);
          else
          ps.setString(i,Objvalue.toString());
            }
            int   a=ps.executeUpdate();
            ////System.out.println(a+ "记录 ");
            isCorrect=true;
            //conn.commit();
        }catch   (SQLException   ex)   {
            ex.printStackTrace();
        }finally{
            Close();
        }
        return   isCorrect;
    }
 
   
    //查询
    public   ResultSet   doQuery(String   sql)
    {
        try{
            rs=getStatement().executeQuery(sql);
        }catch   (SQLException   ex)   {
            ex.printStackTrace();
        }
        return   rs;
    }
    //新增insert   into   、、、、、、
    public   boolean   doInsert(String   sql)
    {
          boolean   isCorrect=false;
        try{
            getStatement().execute(sql);//true   false(执行增删改查sql)
            isCorrect=true;
            //conn.commit();
          }catch(SQLException   ex){
              ex.printStackTrace();
              //conn.rollback();
          }finally{
              Close();
              return   isCorrect;
          }
    }

    public   ResultSet   execMethod(String   sql)
{
    try{
        boolean   is=getStatement().execute(sql);//true   false(执行增删改查sql)
        if(is==true)rs=st.getResultSet();
      }catch(SQLException   ex){
          ex.printStackTrace();
      }finally{
          return   rs;
      }


}

    //修改和删除
    public   boolean   doUpdate(String   sql)
    {
          boolean   isCorrect=false;
          try{
              int   a=getStatement().executeUpdate(sql);//int
              ////System.out.println(a+ "记录! ");
              isCorrect=true;
              //conn.commit();
          }catch(SQLException   e){
                e.printStackTrace();
                //conn.rollback();
          }finally{
              Close();
              return   isCorrect;
          }
    }
    //得到总记录数select   count(*)   from   dept
    public   int   getCount(String   sql)
    {
          int   count=0;
          try{
              rs=getStatement().executeQuery(sql);
              if(rs.next())
              {
                  count=rs.getInt(1);
              }
          }catch(Exception   e){
              e.printStackTrace();
          }finally{
              Close();
              return   count;
          }
    }
    public   String   getOneValue(String   sql)
    {
        String   count= " ";
          try{
              rs=getStatement().executeQuery(sql);
              if(rs.next())
              {
                  count=rs.getString(1);
              }
          }catch(Exception   e){
              e.printStackTrace();
          }finally{
              Close();
              return   count;
          }
    }
    public   int   getPK(String   tablename,String   pkname)
    {
        int   pk=0;
        String   sql= "select   max( "+pkname+ ")   from   "+tablename;
        try{
              rs=this.doQuery(sql);
              rs.next();
              pk=rs.getInt(1)+1;
        }catch(Exception   e){


            e.printStackTrace();
        }finally{
            this.Close();
            return   pk;
        }
    }
    public   List   getCols(String   sql)
    {
  List   list=new   ArrayList();  
          try{
        rs=this.doQuery(sql);
        int   colcount=rs.getMetaData().getColumnCount();
        while(rs.next())
        {
              for(int   i=1;i <=colcount;i++)
              {
            list.add(rs.getString(i));  
              }
        }
          }catch(Exception   e){
          e.printStackTrace();
          }finally{
          Close();
          return   list;
          }
    }
    public   List   getCols(String   sql,List   args)
    {
  List   list=new   ArrayList();  
          try{
        rs=this.execQuery(sql,   args);
        int   colcount=rs.getMetaData().getColumnCount();
        while(rs.next())
        {
              for(int   i=1;i <=colcount;i++)
              {
            list.add(rs.getString(i));  
              }
        }
          }catch(Exception   e){
          e.printStackTrace();
          }finally{
          Close();
          return   list;
          }
    }
 
 

    /************************************************************************************/
    public   void   Close()
    {
      try{
                  if(rs!=null)rs.close();
                  //if(st!=null)st.close();
                  if(conn!=null)conn.close();
                  //if(ps!=null)ps.close();
                  if(cs!=null)cs.close();
            }catch   (SQLException   ex)   {
                ex.printStackTrace();
            }
    }
}


[解决办法]
怎么两个贴一样的?

楼主为何在DAO.close()方法中关闭connection却不关闭其它?


而且rs在JSP中已经关闭了,在dao中却又关闭一次?

mysql数据库就不能用应该是proxool的连接用完了,很多有效连接被废置,这个还需要检查proxool的配置。
比如有个配置项是house-keeping-test-sql,如果这条语句配置不正确也会引发该问题,我们是用:select CURRENT_DATE

[解决办法]
可以把dao中的connection设为static
你出的错误应该是连接太多!
这样保证解决问题!
[解决办法]
学习
[解决办法]
报甚麽错?
[解决办法]
错误信息呢
[解决办法]
应该在DAO中对结果集进行封装,在进行查询完了之后要立即释放结果集,statement,还有数据库连接。
[解决办法]
看看对你有没有帮助.
http://blog.csdn.net/rainv/archive/2007/03/14/1529270.aspx

热点排行
Bad Request.