以前是纯静态页面,网站没事,现在我改回了动态的,,就报连接数已满,网站就不行了,像这个肯定是代码的问题了,大家帮我看看,有什么问题???我连接都是关闭了的啊,是不是这个连数据库的类没写好,这个是网上找的。package com.ttkd.dao;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDriver;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;public class DBConnection {

  private static String    
      driver="com.microsoft.sqlserver.jdbc.SQLServerDriver",//驱动   
      url = "jdbc:sqlserver://localhost:1433;DatabaseName=test",//URL   
      Name="sa",//用户名   
      Password="sa";//密码   
 
private static Class driverClass = null;   
private static ObjectPool connectionPool = null;   public DBConnection(){          
     }       
 
 
/**   
* 初始化数据源   
*/    
private static synchronized void initDataSource() {            
  if (driverClass == null) {    
      try {    
          driverClass = Class.forName(driver);    
      } catch (ClassNotFoundException e) {    
          e.printStackTrace();   
      }    
  }    
}    /**   
* 连接池启动   
* @throws Exception   
*/    
public static void StartPool() {   
  //loadProperties();   
  initDataSource();    
  if (connectionPool != null) {    
      ShutdownPool();    
  }     
  try {    
      connectionPool = new GenericObjectPool(null);  
      ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, Name, Password);    
      PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, null, false, true);    
      Class.forName("org.apache.commons.dbcp.PoolingDriver");    
      PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");    
      driver.registerPool("dbpool", connectionPool);                 
  } catch (Exception e) {    
      e.printStackTrace();   
  }    
}    /**   
* 释放连接池   
*/    
public static void ShutdownPool() {    
  try {    
      PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");    
      driver.closePool("dbpool");   
  } catch (SQLException e) {    
      e.printStackTrace();   
  }    
}        /**   
* 取得连接池中的连接   
* @return   
*/    
public static Connection getConnection() {    
  Connection conn = null;    
  if(connectionPool == null)    
      StartPool();    
  try {    
      conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:dbpool");    
  } catch (SQLException e) {    
      e.printStackTrace();   
  }    
  return conn;    
}    
 
/**  
* 获取连接  
* getConnection  
* @param name  
* @return  
*/  
public static Connection getConnection(String name){   
 return getConnection();   
}   
/**  
* 释放连接  
* freeConnection  
* @param conn  
*/  
public static void freeConnection(Connection conn){   
  if(conn != null){   
      try {   
          conn.close();   
      } catch (SQLException e) {                 
          e.printStackTrace();   
      }   
  }   
}   
/**  
* 释放连接  
* freeConnection  
* @param name  
* @param con  
*/  
public static void freeConnection (String name,Connection con){   
  freeConnection(con);   
}   
} public String getShengNameById(String shengId) throws Exception {
conn = DBConnection.getConnection();
String shengName = "";
sql = "select shengname from sheng where shengid=?";
try {
ps = conn.prepareStatement(sql);
ps.setString(1, shengId);
rs = ps.executeQuery();
while (rs.next()) {
shengName = rs.getString("shengname");
} } catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
conn.close();
}
return shengName;
}

解决方案 »

  1.   

    finally {
                if (rs != null) {
                    rs.close();
                }
                if (ps != null) {
                    ps.close();
                }
                conn.close();
            }
    应该放在连接类里面似乎
      

  2.   

    另外  throws Exception  似乎把异常都抛出了
      

  3.   

    public static void freeConnection(Connection conn) throws SQLException {   //处理异常
      if(conn != null && !conn.isClosed()){ //  没有关闭就关闭
          try {   
              conn.close();   
          } catch (SQLException e) {                 
              //e.printStackTrace(); 
              throw e;  
          }   
      }   
    }
    整体还行
      

  4.   

    我用netstat -an去查,发现线程都在等待