如果把下面的语句注释掉//定义连接池对象为静态变量,将一直存在,直到工作目录关闭。
//private static DataSource ds = null;则在程序里面每次调用
DBprocess dbp = new DBprocess();
都要执行一次lookup操作是不是很浪费资源?另外我还想当调用dbp.close();时
这个对象所占资源就能被JVM回收!

解决方案 »

  1.   

    大家帮忙在看看我改成这样的两个类了
    DbWrapper.java用于lookup数据源 并返回一个连接!只实例化了一次,ds也只有一个对象!减少了lookup系统消耗!
    DBProcess.java是现在数据库操作的封装DbWrapper.java
    package com.util;import java.sql.*;
    import java.util.*;
    import javax.naming.*;
    import javax.sql.*;public class DbWrapper {
      private static DbWrapper instance; // 唯一实例
      private static DataSource ds = null; // 定义连接池对象为静态变量,将一直存在,直到工作目录关闭。  /**
       * 返回唯一实例.如果是第一次调用此方法,则创建实例
       * @return DbWrapper 唯一实例
       */
      static synchronized public DbWrapper getInstance() {
        if (instance == null) {
          instance = new DbWrapper();
        }
        return instance;
      }  //构建函数私有,防止其它对其初始化
      private DbWrapper() {
      }  public static Connection openConnection() throws Exception {
        try {
          // 只需要初始化1次
          if (ds == null) {
            Context initContext = new InitialContext();
            Context envContext = (Context) initContext.lookup("java:/comp/env");
            DataSource ds = (DataSource) envContext.lookup("jdbc/MyDataSource");
          }
        }
        catch (Exception e) {
          e.printStackTrace();
        }
        return ds.getConnection();
      }
    }-----------------------------------------------------
    DBProcess.javapackage com.util;import java.sql.*;
    import javax.naming.*;
    import javax.sql.*;
    import com.hdonline.hdmis.util.DbWrapper;public class DBProcess {  private Connection conn = null;
      private Statement stmt = null;
      private ResultSet rs = null;  /*
       *constructor
       */
      public DBProcess() {
        init();
      }  private void init() {
        try {
          conn = DbWrapper.getInstance().openConnection();
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }  /*
       * get a connection method
       * @return
       */
      public Connection getConnection() {
        return this.conn;
      }  /*
       * close connection and resultset and statement
       */
      public void close(String poolName) {
        try {
          if (rs != null) {
            rs.close();
            rs = null;
          }
          if (stmt != null) {
            stmt.close();
            stmt = null;
          }
          if (conn != null) {
            conn.close();
            conn = null;
          }
        }
        catch (SQLException sqle) {
          System.err.println("数据执行操作 在执行关闭操作时出错!");
          sqle.printStackTrace();
        }
      }  public void close() {
        try {
          if (rs != null) {
            rs.close();
            rs = null;
          }
          if (stmt != null) {
            stmt.close();
            stmt = null;
          }
          if (conn != null) {
            conn.close();
            conn = null;
          }
        }
        catch (SQLException sqle) {
          System.err.println("数据执行操作 在执行关闭操作时出错!");
          sqle.printStackTrace();
        }
      }  /**
       * query
       */
      public ResultSet execQuery(String sql) {
        // get a stmt
        try {
          stmt = conn.createStatement();
        }
        catch (SQLException ex1) {
          if (conn == null) {
            System.out.print("空的连接!!!");
          }
          else {
            System.out.print("关闭的连接!!!");
          }
          ex1.printStackTrace();
        }    //get the resultset
        try {
          rs = stmt.executeQuery(sql);
        }
        catch (SQLException ex) {
          System.err.println("数据执行操作 在执行下列sql语句时产生错误 " + "SQL:" + sql);
          ex.printStackTrace();
        }
        catch (java.lang.Exception ex) {
          ex.printStackTrace();
        }
        return rs;
      }  /**
       * update
       */
      public int execUpdate(String sql) throws SQLException {    int count = 0;
        // get a stmt
        try {
          stmt = conn.createStatement();
        }
        catch (SQLException ex1) {
        }
        // update
        try {
          count = stmt.executeUpdate(sql);
        }
        catch (SQLException ex) {
          System.err.println("数据执行操作 在执行下列sql语句时产生错误 " + "SQL:" + sql);
          ex.printStackTrace();
        }
        catch (java.lang.Exception ex) {
          ex.printStackTrace();
        }    try {
          conn.commit();
        }
        catch (SQLException ex2) {
        }    return count;
      }  /*
       * update without commit
       */
      public int execUpdateNoCommit(String sql) throws SQLException {    int count = 0;
        // get a stmt
        try {
          stmt = conn.createStatement();
        }
        catch (SQLException ex1) {
        }
        // update
        try {
          count = stmt.executeUpdate(sql);
        }
        catch (SQLException ex) {
          System.err.println("数据执行操作 在执行下列sql语句时产生错误 " + "SQL:" + sql);
          ex.printStackTrace();
        }
        catch (java.lang.Exception ex) {
          ex.printStackTrace();
        }    return count;
      }  public void commit() {
        try {
          conn.commit();
        }
        catch (SQLException ex2) {
        }
      }  
      public void Autocommitfalse() throws SQLException { ///开始事务
        conn.setAutoCommit(false);
      }  public void rollback() throws SQLException { ///出错市回滚
        conn.rollback();
      }
    }