【问题标题】:Java Oracle connection pooling - Closed Connection exceptionJava Oracle 连接池 - 关闭连接异常
【发布时间】: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


    【解决方案1】:

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

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

    我还建议使用 Spring 的 JdbcTemplate,因为它可以很好地包装自己的原始 JDBC 调用。

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

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多