on server sideclient ->db connection request-> server -> fetch a connection from its pool -> return to client

解决方案 »

  1.   

    要集中管理数据库连接,当然是服务器端.问题是服务器要启动一个服务线程,这样是不是麻烦?而且在c/s的环境下有必要用连接池吗?连接池的作用不就是减少因为数据库连接造成的网络延迟吗?但是c/s的连接速度相信应该是足够的。这是我的看法,不知道大家怎么看。
      

  2.   

    当然不是了.server端的连接池负责对连接的管理,连接池可以负责对象的重用,提高访问速度,减少对数据库的需求.可以处理大量客户端的连接.
      

  3.   

    package com.hoten.connpools;import java.io.*;
    import java.sql.*;
    import java.util.*;
    import java.util.Date;
    /**
     * This class is a Singleton that provides access to one or many
     * connection pools defined in a Property file. A client gets
     * access to the single instance through the static getInstance()
     * method and can then check-out and check-in connections from a pool.
     * When the client shuts down it should call the release() method
     * to close all open connections and do other clean up.
     */
    public class DBConnectionManager {
        static private DBConnectionManager instance; // The single instance
        static private int clients;
        private String logFile;
        private Vector drivers = new Vector();
        private Hashtable pools = new Hashtable();
      /**
     * Returns the single instance, creating one if it's the
     * first time this method is called.
     *
     * @return DBConnectionManager The single instance.
     */
        static synchronized public DBConnectionManager getInstance() {
            if (instance == null) {
                instance = new DBConnectionManager();
            }
            clients++;
            return instance;
        }/**
     * A private constructor since this is a Singleton
     */
        private DBConnectionManager() {
            init();
        }/**
     * Returns a connection to the named pool.
     *
     * @param name The pool name as defined in the properties file
     * @param con The Connection
     */
        public void freeConnection(String name, Connection con) {
            DBConnectionPool pool = (DBConnectionPool) pools.get(name);
            if (pool != null) {
                pool.freeConnection(con);
            }
        }/**
     * Returns an open connection. If no one is available, and the max
     * number of connections has not been reached, a new connection is
     * created.
     *
     * @param name The pool name as defined in the properties file
     * @return Connection The connection or null
     */
        public java.sql.Connection getConnection(String name) {
            DBConnectionPool pool = (DBConnectionPool) pools.get(name);
            if (pool != null) {
                return pool.getConnection();
            }
            return null;
        }/**
     * Returns an open connection. If no one is available, and the max
     * number of connections has not been reached, a new connection is
     * created. If the max number has been reached, waits until one
     * is available or the specified time has elapsed.
     *
     * @param name The pool name as defined in the properties file
     * @param time The number of milliseconds to wait
     * @return Connection The connection or null
     */
        public java.sql.Connection getConnection(String name, long time) {
            DBConnectionPool pool = (DBConnectionPool) pools.get(name);
            if (pool != null) {
                return pool.getConnection(time);
            }
            return null;
        }
      

  4.   

    /**
     * Closes all open connections and deregisters all drivers.
     */
        public synchronized void release() {
                // Wait until called by the last client
          if (--clients != 0) {
                 return;
          }
          Enumeration allPools = pools.elements();
          while (allPools.hasMoreElements()) {
              DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();
              pool.release();
          }
          Enumeration allDrivers = drivers.elements();
          while (allDrivers.hasMoreElements()) {
              Driver driver = (Driver) allDrivers.nextElement();
              try {
                  DriverManager.deregisterDriver(driver);
                  Log1.printMessage("Deregistered JDBC driver " + driver.getClass().getName(),logFile);
              }
              catch (SQLException e) {
                  Log1.printMessage("Can't deregister JDBC driver: " + driver.getClass().getName()+" Exception:"+e.getMessage(),logFile);
              }
          }
      }/**
     * Creates instances of DBConnectionPool based on the properties.
     * A DBConnectionPool can be defined with the following properties:
     * <PRE>
     * &lt;poolname&gt;.url The JDBC URL for the database
     * &lt;poolname&gt;.user  A database user (optional)
     * &lt;poolname&gt;.passwordA database user password (if user specified)
     * &lt;poolname&gt;.maxconn The maximal number of connections (optional)
     * </PRE>
     *
     * @param props The connection pool properties
     */
        private void createPools(Properties props) {
            Enumeration propNames = props.propertyNames();
            while (propNames.hasMoreElements()) {
                String name = (String) propNames.nextElement();
                if (name.endsWith(".url")) {
                    String poolName = name.substring(0, name.lastIndexOf("."));
                    String url = props.getProperty(poolName + ".url");
                    if (url == null) {
                        Log1.printMessage("No URL specified for " + poolName,logFile);
                        continue;
                    }
                    String user = props.getProperty(poolName + ".user");
                    String password = props.getProperty(poolName + ".password");
                    String maxconn = props.getProperty(poolName + ".maxconn", "3");
                    String minconn = props.getProperty(poolName + ".minconn","1");
                    String defconn = props.getProperty(poolName + ".defconn","2");
                    int max,min,def;
                    try {
                        max = Integer.valueOf(maxconn.trim()).intValue();
                        min = Integer.valueOf(minconn.trim()).intValue();
                        def = Integer.valueOf(defconn.trim()).intValue();
                    }
                    catch (Exception e) {
                        Log1.printMessage("Invalid maxconn value " + maxconn + " for " + poolName,logFile);
                        Log1.printMessage("Invalid minconn value " + minconn + " for " + poolName,logFile);
                        Log1.printMessage("Invalid minconn value " + defconn + " for " + poolName,logFile);
                        max = 3;
                        min=1;
                        def=2;
                    }
                    DBConnectionPool pool = new DBConnectionPool(poolName, url.trim(), user, password, max,min,def);
                    pools.put(poolName, pool);
                    Log1.printMessage("Initialized pool " + poolName,logFile);
                }
            }
      }
      

  5.   

    通过rmi的方式,取得远程连接池的一个实例