如您所见,此代码是我的数据访问对象层的一部分。 我之前从未使用过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();
}
}
}
答案 0 :(得分:2)
可以使用constructor创建ConnectionPool
,resources接受一些池属性。即使这个构造函数暴露在您的应用程序中创建一个池,特别是在每个DAO中可能都不可取。
池的关键是拥有一个连接池,应用程序可以从需要对数据库执行某些操作时检索连接。使用此设计,代码将具有多个连接池,这会使池化失败。
通常在Tomcat中建立数据源,Tomcat在内部处理连接池的构建。有关Tomcat中连接池的更多信息,请参阅这些{{3}}。
答案 1 :(得分:1)
在'DBService'类中创建它&amp;如果你真的不想在Tomcat中定义它,请分享它。正如Duffy所说,在Tomcat中定义它可能是最好的方式..
getInstance()语法显示全部错误。用于创建&amp;直接配置,请参阅:http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html
答案 2 :(得分:0)
我会让Tomcat为您管理该池。它有关于如何创建JNDI数据源的说明。你应该这样做,并从你的代码中解决这个问题。
从您的应用中外部化连接参数还有其他好处。它们将在应用服务器上进行配置。