【发布时间】:2011-03-09 20:12:27
【问题描述】:
这篇文章的目的不是一个问题,而是一个确认我做正确的事情。我看过很多类似的帖子,但我不确定我是否完全理解所说的一切。
问题是,经过一段时间后,我在尝试与我的 oracle 数据库建立连接时遇到异常。 (我使用的是 Tomcat 6.0 和 Spring)
之前我有以下配置:
private PoolDataSource poolDataSource = null;
public MainDAOImpl(String url, String username, String password)
throws Exception
{
poolDataSource = PoolDataSourceFactory.getPoolDataSource();
try
{
poolDataSource.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
poolDataSource.setURL(url);
poolDataSource.setUser(username);
poolDataSource.setPassword(password);
}
catch( SQLException e )
{
...
}
}
public List<Object> getValues(String query)
{
Connection connection = null;
PreparedStatement preparedStatement = null;
try
{
connection = poolDataSource.getConnection();
preparedStatement = connection.prepareStatement(query);
...
}
catch( SQLException e )
{
...
}
finally
{
//close connections
}
}
但是,有时preparedStatement = connection.prepareStatement(query); 会抛出带有“已关闭异常”消息的 SQLException。
重要的是要注意 MainDAOImpl 的构造函数在每次服务器重启时只被调用一次(它是通过 Spring 注入的依赖项)。
我最近像这样更改了设置:
private DataSource dataSource = null;
public MainDAOImpl()
throws Exception
{
try
{
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
dataSource = (DataSource)envContext.lookup("jdbc/myOracleConn");
}
catch( NamingException e )
{
...
}
}
和poolDataSource.getConnection() 到dataSource.getConnection()。
我还在 Tomcat 的上下文中添加了以下资源:
<Resource name="jdbc/myOracleConn" auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="<myURL>"
username="<myUsername>" password="<myPassword>"
maxActive="20" maxIdle="10" maxWaith="-1" />
这基本上遵循http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html逐字逐句。
似乎一切正常。我的问题是,这些更改会解决我的关闭连接问题还是我需要做一些不同的事情?
谢谢,
B.J.
【问题讨论】:
标签: java oracle jdbc connection-pooling