JSP/DAO 错误:未为 ConnectionPool 类型定义方法 getInstance()

Posted

技术标签:

【中文标题】JSP/DAO 错误:未为 ConnectionPool 类型定义方法 getInstance()【英文标题】:JSP/ DAO error : The method getInstance() is undefined for the type ConnectionPool 【发布时间】:2013-05-11 02:30:06 【问题描述】:

如您所见,此代码是我的数据访问对象层的一部分。 我以前从未使用过 ConnectionPool 对象,因为我还在学习 Java。 无论如何,我收到一条错误消息:

没有为 ConnectionPool 类型定义方法 getInstance()。 (第 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);
        
    

我刚刚发现我犯了一个错误: - 我上面提到的类中的 ConnectionPool 不应该是 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();
        
    

【问题讨论】:

希望在这方面有更多经验的人,但我不确定你是否想在你的代码中创建一个这样的连接池。连接池有一个构造函数来创建一个池,但这会创建一个池的新实例,连接池背后的想法是为应用程序共享一个池。 【参考方案1】:

可以使用接受一些池属性的constructor 创建ConnectionPool。即使这个构造函数暴露在你的应用程序中创建一个池,尤其是在每个 DAO 中,可能并不可取。

池的意义在于拥有一个连接池,当应用程序需要对数据库执行某些工作时,它可以从中检索连接。使用这种设计,代码将有多个连接池,这违背了池的意义。

通常在 Tomcat 内部建立一个数据源,它在内部处理连接池的构建。有关 Tomcat 中的连接池的更多信息,请参阅这些 resources。

【讨论】:

感谢您的意见。我可能会尝试使用 BoneCP 来管理我的连接池。【参考方案2】:

如果您真的不想在 Tomcat 中定义它,请在“DBService”类中创建它并共享它。正如 Duffy 所说,在 Tomcat 中定义它可能是最好的方法..

在 Tomcat 中定义它:http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html#Database_Connection_Pool_(DBCP)_Configurations

getInstance() 语法似乎完全错误。要直接创建和配置它,请参阅:http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

【讨论】:

【参考方案3】:

我会让 Tomcat 为您管理该池。它包含有关如何创建 JNDI 数据源的说明。你应该这样做并从你的代码中得到它。

它还有一个额外的好处,那就是从您的应用程序中外部化连接参数。它们将存在于应用服务器上的配置中。

【讨论】:

以上是关于JSP/DAO 错误:未为 ConnectionPool 类型定义方法 getInstance()的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Firestore 错误:未为“对象”类定义运算符“[]”

发送 api 活动请求时出现“未为帐户启用路由”错误

错误:未为颤振中的“FirebaseMessaging”类型定义“配置”方法

错误“未为 UserManager 类型定义方法 createUser(String, int)”

VBA ADODB 错误 -2147217904 - 未为某些必需参数指定值

错误 SQL Server 2012:未为函数 X 提供参数