2013-05-16 67 views
0

如您所見,此代碼是我的數據訪問對象層的一部分。 我之前從未使用過ConnectionPool對象,因爲我仍在學習Java。 無論如何,我得到一條錯誤消息指出:JSP/DAO錯誤:方法getInstance()未定義類型ConnectionPool

的方法的getInstance()是未定義的類型連接池。 (at line 5)

如果您有任何人曾經遇到過這種情況,將不勝感激。

import java.sql.*; 
import java.util.*; 

import org.apache.tomcat.jdbc.pool.ConnectionPool; 

import music.business.*; 

public class ProductDB 
{ 
    //This method returns null if a product isn't found. 
    public static Product selectProduct(String productCode) 
    { 
     ConnectionPool pool = ConnectionPool.getInstance(); //<===<====<====<================= 
     Connection connection = pool.getConnection(); 
     PreparedStatement ps = null; 
     ResultSet rs = null; 

     String query = "SELECT * FROM Product " + 
       "WHERE ProductCode = ?"; 
     try 
     { 
      ps = connection.prepareStatement(query); 
      ps.setString(1, productCode); 
      rs = ps.executeQuery(); 
      if (rs.next()) 
      { 
       Product p = new Product(); 
       p.setCode(rs.getString("ProductCode")); 
       p.setDescription(rs.getString("ProductDescription")); 
       p.setPrice(rs.getDouble("ProductPrice")); 
       return p; 
      } 
      else 
      { 
       return null; 
      } 
     } 
     catch(SQLException e) 
     { 
      e.printStackTrace(); 
      return null; 
     } 
     finally 
     { 
      DBUtil.closeResultSet(rs); 
      DBUtil.closePreparedStatement(ps); 
      pool.freeConnection(connection); 
     } 
    } 

我剛剛發現我犯了一個錯誤: - 我的,上面提到的,是不應該類中的Tomcat導入的連接池。它是一個JNDI類。見下文。 getInstance實際上是我的JNDI類中的一個方法。很抱歉,你們的時間會減少。謝謝

import java.sql.*; 
import javax.sql.DataSource; 
import javax.naming.InitialContext; 

public class ConnectionPool 
{ 
    private static ConnectionPool pool = null; 
    private static DataSource dataSource = null; 

    public synchronized static ConnectionPool getInstance() 
    { 
     if (pool == null) 
     { 
      pool = new ConnectionPool(); 
     } 
     return pool; 
    } 

    private ConnectionPool() 
    { 
     try 
     { 
      InitialContext ic = new InitialContext(); 
      dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/musicDB"); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public Connection getConnection() 
    { 
     try 
     { 
      return dataSource.getConnection(); 
     } 
     catch (SQLException sqle) 
     { 
      sqle.printStackTrace(); 
      return null; 
     } 
    } 

    public void freeConnection(Connection c) 
    { 
     try 
     { 
      c.close(); 
     } 
     catch (SQLException sqle) 
     { 
      sqle.printStackTrace(); 
     } 
    } 
} 
+0

希望有更多經驗的人對此有評論,但我不確定您希望如何在您的代碼中創建連接池。連接池有一個構造函數來創建一個池,但是這將創建一個新的池實例,並且連接池背後的想法是爲應用程序共享一個池。 –

回答

0

我會讓Tomcat爲您管理該池。它有關於如何創建JNDI數據源的說明。你應該這樣做,並從你的代碼中得到這個。

它將從您的應用程序外部化連接參數的額外好處。他們將在應用服務器上進行配置。

+0

這是正確的答案。謝謝 –

2

一個ConnectionPool可以使用其constructor它接受一些池屬性創建。即使這個構造函數暴露在你的應用程序中創建一個池,特別是在每個DAO中可能不是可取的。

池化的要點是應用程序可以從需要執行數據庫工作時檢索連接的單個連接池。使用這種設計,代碼將擁有多個連接池,這會破壞共享點。

通常在Tomcat中建立一個數據源,它在內部處理建立連接池。有關Tomcat中連接池的更多信息,請參閱這些resources

+0

感謝您的意見。我可能會嘗試使用BoneCP管理我的連接池。 –

相關問題