我正在尝试使用Java中的Web应用程序的池连接。我正在使用Oracle数据库,这是我的代码:
public class DatabaseHandler
{
static private Connection m_database = null;
static private OracleConnectionPoolDataSource pooledSource = null;
/**
* Attempts to open an Oracle database located at the specified serverName and port.
* @param serverName Address of the server.
* @param portNumber Port to connect to.
* @param sid SID of the server.
* @param userName Username to login with.
* @param password Password to login with.
* @throws WebApplicationException with response code 500 Internal Server Error.
*/
static public void openDatabase(String userName, String password,String serverName,int portNumber, String sid)
throws WebApplicationException
{
try
{
// Load the JDBC driver
String driverName = "oracle.jdbc.driver.OracleDriver";
Class.forName(driverName);
// Create a connection to the database
String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
pooledSource = new OracleConnectionPoolDataSource();
pooledSource.setUser(userName);
pooledSource.setURL(url);
pooledSource.setPassword(password);
m_database = pooledSource.getConnection();
}
catch (ClassNotFoundException e)
{
// Could not find the database driver
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
catch (SQLException e)
{
// Could not connect to the database
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
}
/**
* Attempts to execute the specified SQL query.
* @throws WebApplicationException with a response code of Bad Request
* if the query is invalid SQL.
*/
static public ResultSet makeQuery(String query) throws WebApplicationException
{
ResultSet rs = null;
if (m_database != null)
{
try
{
Statement stmt = m_database.createStatement();
rs = stmt.executeQuery(query);
}
catch (SQLException e)
{
// invalid query
System.out.println(query);
throw new WebApplicationException(Response.Status.BAD_REQUEST);
}
}
return rs;
}
/**
* Attempts to close the database.
* @throws WebApplicationException with a response code of 500 Server error
*/
static public void closeDatbase() throws WebApplicationException
{
try
{
m_database.close();
pooledSource.close();
}
catch(SQLException e)
{
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
}
}
我在Eclipse中这样做,并且警告pooledSource.close()
已被弃用。我以前从未使用过汇集连接,我只是想确保我正在做的一切正确。有没有更好的方法来关闭Oracle池化资源?
答案 0 :(得分:6)
不推荐使用的方法意味着不应使用此方法。在将来的版本中,close()
方法可以完全清除。我建议删除pooledSource.close()
。
另外,我建议不要有Connection
和DataSource
的静态实例,因为您需要连接请求并且不要在整个应用程序中保持活动状态。通过在ResultSet
块中添加闭包,首先关闭Connection
,然后关闭finally
和保证关闭。
答案 1 :(得分:1)
closeDatabase()
,则表示您正在泄漏连接。注意:
不要混淆关闭connection
并在此关闭connection pool
。
因为这里要求的是一些正确和良好连接处理的代码:
public void doSomethingWithDb(Connection con, ...) {
boolean release = (con == null);
try {
con = PersistenceUtils.getConnection(con); //static helper return a new conenction from pool when provided con==null otherwise simply returns the given con
//do something
if(release) {
con.commit();
}
}
catch(SQLException e) {
//handle errors, i.e. calling con.rollback() but be sure to check for con!=null before. Again maybe null-safe static helper method here.
}
finally {
if(release && con!=null){
con.close();
}
}
}
我使用Connection作为方法参数,以便能够在一个db事务中调用许多此类方法。但是你总是可以将null
作为Connection的第一个参数,并且该方法可以为你从池中获取连接。
当您在“DB-Method”中调用另一个“DB-Method”时,您只需提供与基础方法的连接 - 这样您就可以在一个事务中拥有所有内容。
正如您所看到的,正确的JDBC代码产生了很多样板代码。在第一步中,您可以通过实现像PersistenceUtils这样的实用程序类来减少它,它提供静态空安全方法,如提交(连接),回滚(连接),getConnection(连接),关闭(连接)...... 有了它你就可以摆脱所有的空检查,你也可以在那里包含日志记录或其他东西。