2015-04-24 183 views
2

我看到数据库连接在应用程序关闭后没有关闭。当应用程序关闭时,jdbctemplate关闭连接?

我们使用Spring org.springframework.jdbc.core.support.JdbcTemplate,并配置了一个连接池。例如Tomcat的上下文XML是这样的:

<Resource name="jdbc/fooResource" 
     auth="Container" 
     testOnBorrow="true" 
     validationQuery="select 1 from DUAL" 
     type="javax.sql.DataSource" 
     factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
     username="user" 
     password="password" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/myschema" 
     maxActive="100" 
     maxIdle="10"/> 

我的Spring bean定义有这个片段:

<jee:jndi-lookup id = "dataSource" 
    jndi-name = "jdbc/fooResource" 
     expected-type = "javax.sql.DataSource"/> 

观察:

  1. 的MySQL启动时,它显示了连接:6
  2. 用我的一个网络应用程序启动Tomcat,在MySQL中,我现在看到连接:16.
  3. 停止Tomcat和16个连接。
  4. 我停止/启动Tomcat和连接只是不断攀登(我想通过10自INITIALSIZE默认为10?)

问题:

  1. 我的文档读取使用Spring JdbcTemplate负责连接(提取并将它们释放到池中),但关闭时发生了什么 - 我的连接是否应该在关闭时关闭?
  2. 我应该做其他事情来确保应用程序关闭后所有数据库连接都会关闭吗?

谢谢。

+0

您正在使用一个池,从应用程序的角度来看,连接已关闭,但连接池的内部实际上并未关闭它们将它们返回到池的连接。所以基本上它按预期工作。 –

+0

当应用程序启动并运行时,这会很有意义,即连接返回到池中,但人们会希望在应用程序关闭后连接完全关闭,否? –

+0

没有原因。对于应用程序,它们已经关闭。它不知道连接池只有一个'DataSource',并且从应用程序的角度来看,一切都已经完成,以正确地管理连接。 –

回答

1

如果您手动创建应用程序上下文,则需要在应用程序上下文中注册一个关闭挂钩。当你启动应用程序,获得上下文的引用,并添加此行

context.registerShutdownHook(); 

如果你不这样做,不会被触发破坏事件。

+0

我们不是手动创建上下文。 –

+0

实现'ApplicationContextAware',你可以将上下文注入到bean中。 –

+0

我发现我必须将ApplicationContext转换为ConfigurableApplicationContext才能执行此操作 – wytten

相关问题