Spring jdbc模板

Spring jdbc模板,spring,jdbc,database-connection,datasource,connection-pooling,Spring,Jdbc,Database Connection,Datasource,Connection Pooling,最近我遇到了一些事情 我对Spring的JdbcTemplate的理解是,您可以调用: JdbcTemplate template = new JdbcTemplate(dataSource); Connection conn = template.getDataSource().getConnection(); 它使用传入的数据源从JdbcTemplate返回连接。如果我这样做: template.getDataSource().getConnection().close(); 这仅仅

最近我遇到了一些事情

我对Spring的JdbcTemplate的理解是,您可以调用:

JdbcTemplate template = new JdbcTemplate(dataSource);
Connection conn = template.getDataSource().getConnection();
它使用传入的数据源从JdbcTemplate返回连接。如果我这样做:

template.getDataSource().getConnection().close();  
这仅仅是获取另一个连接并关闭它,从而创建一个泄漏的资源,还是为您获取它正在使用的连接

编辑:

我在一堂课上写了两个方法:一个是编写JDBC语句的老派低级方法(带有连接、语句和结果集):

另一种方法是:

public void execute2(String tableName) {

    String nameOS = System.getProperty("os.name");
    String sql = (nameOS.equals("OS/400")) ? "DELETE from " + tableName : 
        "DELETE from " + tableName + " with none";

    JdbcTemplate templateSNPJ;

    templateSNPJ = new JdbcTemplate(this.snpjDataSource);
    templateSNPJ.update(sql);

    logger.info("Finished clearing: " + tableName);
    getServiceManager().unregisterService(this);
}
我用这种方法正确地清理了资源。第二种方法是使用:

JdbcTemplate.update(sqlCommand);
但是,JdbcTemplate使连接保持活动的时间似乎比池的配置时间长

我是在SO上读到这篇文章的:它避免了必须使用数据源配置和在bean中定义的destroy method=closed参数,如下所示:

    <bean id="SnpjDataSource" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" destroy-method="close">
      <property name="uniqueResourceName" value="@#$$datasource"/>
      <property name="driverClassName" value="com.ibm.as400.access.AS400JDBCDriver"/>
      <property name="url" value="jdbc:as400://VIPER/******"/>
      <property name="user" value="FuManChu"/>
      <property name="password" value="*%$@^%$*#^$@^$@"/>
      <property name="maxPoolSize" value="10"/>
      <property name="reapTimeout" value="40"/>
    </bean> 

这取决于您的数据源。如果要确保使用相同的连接,请在
#getConnection
调用中保留一个句柄,或者使用一个。请注意,要使用此数据源,您必须在线程安全的环境中操作。它本身不是线程安全的


此外,您实际上不需要直接访问
连接。这就是
JdbcTemplate
的全部要点。它隐藏了JDBC的内部结构。。。避免连接泄漏等风险。

出于兴趣,您为什么需要访问连接?@wmorricon365我在顶部添加了更多信息。我第一次就想把它放进去。Spring据说管理了后端资源的关闭,但它似乎没有清理资源。我的连接池连接不足。这个类是唯一在计时器线程中运行的东西。我还将其缩小到了泄漏的JdbcTemplate。如果你看一下我的ConnectionRecycler.recycleConnection()方法,它非常简单。我注意到您使用的是
AtomikosNonXADataSourceBean
,并且具有池连接。我想知道你是否知道这个DS是如何提供连接并回收它们的。它的
#close
是否确实关闭了连接或将其重新添加到池中。在看到失败之前,您进行了多少次迭代?它是否超过了
com.atomikos.datasource.pool.ConnectionPool#borrowConnectionTimeout
?i、 e.连接是否可重复使用?另外,您是否尝试在测试中使用替代数据源(将问题隔离到JDBCTemplate、DS或您的配置?实际上,我现在正在研究这一问题。该系统是从IBM子公司Genelco(用于人寿保险)购买的并通过一些从RPG到Java的代码转换器运行。对不起,我被从我的办公桌上拿走了:这是编辑-实际上我现在正在研究这个。这个系统是从IBM子公司Genelco购买的(这是人寿保险公司的)并通过一些从RPG到Java的代码转换器运行。为了回答您的问题,迭代非常简单删除对ConnectionRecycler的调用,并将ReoptimeOut设置为0,在清空connectionPool之前,我可以运行服务整整10次。下一步可能是测试另一个数据源。
    <bean id="SnpjDataSource" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" destroy-method="close">
      <property name="uniqueResourceName" value="@#$$datasource"/>
      <property name="driverClassName" value="com.ibm.as400.access.AS400JDBCDriver"/>
      <property name="url" value="jdbc:as400://VIPER/******"/>
      <property name="user" value="FuManChu"/>
      <property name="password" value="*%$@^%$*#^$@^$@"/>
      <property name="maxPoolSize" value="10"/>
      <property name="reapTimeout" value="40"/>
    </bean> 
public static void recycleConnection(Statement state, boolean closeConnection, 
        Connection connect) {
    try {
        state.close();
        if (closeConnection) {
            connect.close();
        }
    } catch (SQLException sqlEx) {
        logger.error("Error closing resources!  ", sqlEx);
    }
}