gpt4 book ai didi

Java Oracle 连接池 - 关闭连接异常

转载 作者:行者123 更新时间:2023-12-01 16:03:47 26 4
gpt4 key购买 nike

这篇文章的目的不是提出问题,而是确认我正在正确地做事。我看过很多类似的帖子,但我不确定我是否完全理解其中所说的一切。

问题是,在一段时间后,我在尝试建立与 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); 会抛出带有“Closed Exception”消息的 SQLException。

需要注意的是,每次服务器重新启动时,MainDAOImpl 的构造函数只会被调用一次(它是通过 Spring 注入(inject)的依赖项)。

我最近更改了我的设置,如下所示:

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.

最佳答案

首先,如果您使用 Spring 进行依赖注入(inject),我建议您也使用 DI 将 DAO 的依赖注入(inject)其中。

换句话说,您的 DAO 应该注入(inject)一个 DataSource,而不是 DAO 实现知道 1) 要构造什么类型的 DataSource 或 2) 如何以及在何处在 JNDI 中查找它。 Spring can handle JNDI lookups为你。

我还建议使用 Spring 的 JdbcTemplate ,因为它为您自己的原始 JDBC 调用提供了一个很好的包装器。

最后,您收到的实际异常可能只是因为数据库服务器正在关闭长时间打开的连接。不确定您使用的是哪种连接池实现,但在 commons-dbcp 中有 an option for a "validationQuery"池将在返回连接之前执行该连接以验证连接是否仍然有效。我确信大多数其他池都提供类似的功能,我在这里推荐这些功能 - 这样您的 DAO 就永远不会从池中接收过时的连接。

关于Java Oracle 连接池 - 关闭连接异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3144537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com