更新:显然Tomcat(从7.0.11开始)为您关闭了DataSource,因此它在webapp的contextDestroyed中不可用。请参阅:https://issues.apache.org/bugzilla/show_bug.cgi?id=25060
您好,
我正在使用Spring 3.0和Java 1.6。
如果我以这种方式获得数据源:
<bean id="dataSource" class="my.data.Source" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:home"/>
<property name="username" value="user"/>
<property name="password" value="pw"/>
</bean>
然后在bean被销毁时关闭数据源。
如果我得到这样的数据源:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/db" />
然后我必须在contextDestroyed监听器中显式关闭数据源吗?
谢谢,
保罗答案 0 :(得分:5)
我不同意。我会在你的web.xml中添加一个监听器并实现contextDestroyed()方法。当Web应用程序被销毁或取消部署时,您的Web容器/应用服务器将调用此方法。在contextDestroyed()中,我将关闭数据源。
在web.xml中
<listener>
<listener-class>util.myApplicationWatcher</listener-class>
</listener>
代码:
package util;
public class myApplicationWatcher implementes ServletContextListener
{
public void contextInitialized(ServletContextEvent cs)
{
// This web application is getting started
// Initialize connection pool here by running a query
JdbcTemplate jt = new JdbcTemplate(Dao.getDataSource() );
jt.queryForInt("Select count(col1) from some_table");
}
public void contextDestroyed(ServeletContextEvent ce)
{
// This web application is getting undeployed or destroyed
// close the connection pool
Dao.closeDataSource();
}
}
public class Dao
{
private static DataSource ds;
private static bDataSourceInitialized=false;
private static void initializeDataSource() throws Exception
{
InitialContext initial = new InitialContext();
ds = (DataSource) initial.lookup(TOMCAT_JNDI_NAME);
if (ds.getConnection() == null)
{
throw new RuntimeException("I failed to find the TOMCAT_JNDI_NAME");
}
bDataSourceInitialized=true;
}
public static void closeDataSource() throws Exception
{
// Cast my DataSource class to a c3po connection pool class
// since c3po is what I use in my context.xml
ComboPooledDataSource cs = (ComboPooledDatasource) ds;
// close this connection pool
cs.close();
}
public static DataSource getDataSource() throws Exception
{
if (bDataSourceInitialized==false)
{
initializeDataSource();
}
return(ds);
}
}
答案 1 :(得分:4)
没有。这里的DataSource
由远程JNDI容器管理,而该容器的工作是管理DataSource
的生命周期。 Spring只是利用它,它不管理它。
即使您愿意,也不能 - DataSource
没有close()
方法或类似的方法。
答案 2 :(得分:1)
当您通过JNDI获取数据源时,查找共享资源 - 在容器中配置。它由容器管理,而不是由应用程序管理,因此不需要(没有办法)关闭它。