/**
     * Loads properties and initializes the instance with its values.
     */
    private void init() {
        InputStream is = getClass().getResourceAsStream("/db.properties");
        Properties dbProps = new Properties();
        try {
            dbProps.load(is);
        }
        catch (Exception e) {
            System.err.println("Can't read the properties file. " +
                "Make sure db.properties is in the CLASSPATH");
            return;
        }
        String logFile = dbProps.getProperty("logfile", "DBConnectionManager.log");
        try {
            log = new PrintWriter(new FileWriter(logFile, true), true);
        }
        catch (IOException e) {
            System.err.println("Can't open the log file: " + logFile);
            log = new PrintWriter(System.err);
        }
        loadDrivers(dbProps);
        createPools(dbProps);
    }
    
    /**
     * Loads and registers all JDBC drivers. This is done by the
     * DBConnectionManager, as opposed to the DBConnectionPool,
     * since many pools may share the same driver.
     *
     * @param props The connection pool properties
     */
    private void loadDrivers(Properties props) {
        String driverClasses = props.getProperty("drivers");
        StringTokenizer st = new StringTokenizer(driverClasses);
        while (st.hasMoreElements()) {
            String driverClassName = st.nextToken().trim();
            try {
                Driver driver = (Driver) 
                    Class.forName(driverClassName).newInstance();
                DriverManager.registerDriver(driver);
                drivers.addElement(driver);
                log("Registered JDBC driver " + driverClassName);
            }
            catch (Exception e) {
                log("Can't register JDBC driver: " +
                    driverClassName + ", Exception: " + e);
            }
        }
    }
    
    /**
     * Writes a message to the log file.
     */
    private void log(String msg) {
        log.println(new Date() + ": " + msg);
    }
    
    /**
     * Writes a message with an Exception to the log file.
     */
    private void log(Throwable e, String msg) {
        log.println(new Date() + ": " + msg);
        e.printStackTrace(log);
    }
    
    /**
     * This inner class represents a connection pool. It creates new
     * connections on demand, up to a max number if specified.
     * It also makes sure a connection is still open before it is
     * returned to a client.
     */
    class DBConnectionPool {
        private int checkedOut;
        private Vector freeConnections = new Vector();
        private int maxConn;
        private String name;
        private String password;
        private String URL;
        private String user;
        
        /**
         * Creates new connection pool.
         *
         * @param name The pool name
         * @param URL The JDBC URL for the database
         * @param user The database user, or null
         * @param password The database user password, or null
         * @param maxConn The maximal number of connections, or 0
         *   for no limit
         */
        public DBConnectionPool(String name, String URL, String user, String password, 
                int maxConn) {
            this.name = name;
            this.URL = URL;
            this.user = user;
            this.password = password;
            this.maxConn = maxConn;
        }
        
        /**
         * Checks in a connection to the pool. Notify other Threads that
         * may be waiting for a connection.
         *
         * @param con The connection to check in
         */
        public synchronized void freeConnection(Connection con) {
            // Put the connection at the end of the Vector
            freeConnections.addElement(con);
            checkedOut--;
            notifyAll();
        }

解决方案 »

  1.   


            /**
             * Checks out a connection from the pool. If no free connection
             * is available, a new connection is created unless the max
             * number of connections has been reached. If a free connection
             * has been closed by the database, it's removed from the pool
             * and this method is called again recursively.
             */
            public synchronized Connection getConnection() {
                Connection con = null;
                if (freeConnections.size() > 0) {
                    // Pick the first Connection in the Vector
                    // to get round-robin usage
                    con = (Connection) freeConnections.firstElement();
                    freeConnections.removeElementAt(0);
                    try {
                        if (con.isClosed()) {
                            log("Removed bad connection from " + name);
                            // Try again recursively
                            con = getConnection();
                        }
                    }
                    catch (SQLException e) {
                        log("Removed bad connection from " + name);
                        // Try again recursively
                        con = getConnection();
                    }
                }
                else if (maxConn == 0 || checkedOut < maxConn) {
                    con = newConnection();
                }
                if (con != null) {
                    checkedOut++;
                }
                return con;
            }
            
            /**
             * Checks out a connection from the pool. If no free connection
             * is available, a new connection is created unless the max
             * number of connections has been reached. If a free connection
             * has been closed by the database, it's removed from the pool
             * and this method is called again recursively.
             * <P>
             * If no connection is available and the max number has been 
             * reached, this method waits the specified time for one to be
             * checked in.
             *
             * @param timeout The timeout value in milliseconds
             */
            public synchronized Connection getConnection(long timeout) {
                long startTime = new Date().getTime();
                Connection con;
                while ((con = getConnection()) == null) {
                    try {
                        wait(timeout);
                    }
                    catch (InterruptedException e) {}
                    if ((new Date().getTime() - startTime) >= timeout) {
                        // Timeout has expired
                        return null;
                    }
                }
                return con;
            }
            
            /**
             * Closes all available connections.
             */
            public synchronized void release() {
                Enumeration allConnections = freeConnections.elements();
                while (allConnections.hasMoreElements()) {
                    Connection con = (Connection) allConnections.nextElement();
                    try {
                        con.close();
                        log("Closed connection for pool " + name);
                    }
                    catch (SQLException e) {
                        log(e, "Can't close connection for pool " + name);
                    }
                }
                freeConnections.removeAllElements();
            }
            
            /**
             * Creates a new connection, using a userid and password
             * if specified.
             */
            private Connection newConnection() {
                Connection con = null;
                try {
                    if (user == null) {
                        con = DriverManager.getConnection(URL);
                    }
                    else {
                        con = DriverManager.getConnection(URL, user, password);
                    }
                    log("Created a new connection in pool " + name);
                }
                catch (SQLException e) {
                    log(e, "Can't create a new connection for " + URL);
                    return null;
                }
                return con;
            }
        }
    }
      

  2.   

    他的最大连接数是在配置文件中读取的
    String maxconn = props.getProperty(poolName + ".maxconn", "0");
      

  3.   

    属性文件位于WEB-INF\classes目录下
      

  4.   

    InputStream is = getClass().getResourceAsStream("/db.properties");
            Properties dbProps = new Properties();
            try {
                dbProps.load(is);
            }
            catch (Exception e) {
                System.err.println("Can't read the properties file. " +
                    "Make sure db.properties is in the CLASSPATH");
                return;
            }
            String logFile = dbProps.getProperty("logfile", "DBConnectionManager.log");
            try {
                log = new PrintWriter(new FileWriter(logFile, true), true);
            }
            catch (IOException e) {
                System.err.println("Can't open the log file: " + logFile);
                log = new PrintWriter(System.err);
            }
            loadDrivers(dbProps);
            createPools(dbProps);
        }
    上面的一段是init()方法,这个方法的InputStream is = getClass().getResourceAsStream("/db.properties");一句取得了属性文件位于WEB-INF\classes目录下的db.properties这个文件,并把这个文件读到了is这个inputstream中,dbProps.load(is);读到了dbProps中,通过createPools(dbProps)传到了String maxconn = props.getProperty(poolName + ".maxconn", "0");一句,并由它最终读出来的。
    也就是说最大连接数写在WEB-INF\classes目录下的db.properties文件中
      

  5.   

    最大连接一般设置为多少我记得jive安装的时候好像是15