如果假设我将ServletContextListener#contextInitialized()中的数据源初始化为:
package com.myapp.listeners;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.sql.DataSource;
public class MyAppListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent event) {
}
@Override
public void contextInitialized(ServletContextEvent event) {
try{
InitialContext initialContext = new InitialContext();
DataSource dataSource = (DataSource) initialContext.lookup("jdbc/myDB");
event.getServletContext().setAttribute("datasource", dataSource);
}catch(NamingException ne){
// TODO WHAT TO DO HERE?
}
}
}
那么,如果初始化数据源失败怎么办?我如何防止Tomcat部署此应用程序,因为如果没有数据源,我将不会部署任何应用程序。
最佳答案
数据源应该可以通过JNDI查找获得,而不是像这样。我建议您将此代码包装在一个方法中,而不是从ServletContext中检索它。
问题是:如果初始化数据源失败怎么办?如何防止Tomcat部署此应用程序?
将自定义RuntimeException
放入contextInitialized
中,将不会部署该应用程序。
要从您的数据源检索连接:
//no need to extend from this class
public final class ConnectionProvider {
private static final String DEFAULT_DS = "jdbc/myDB";
//no need to initialize this class
private ConnectionProvider() {
}
//retrieve the connection
public static Connection getConnection() {
Connection con = null;
try {
InitialContext initialContext = new InitialContext();
DataSource dataSource = (DataSource) initialContext.lookup(DEFAULT_DS);
con = dataSource.getConnection();
} catch (Exception e) {
//handle exception
//basic handling, you should at least use a logger
e.printStackTrace();
}
return con;
}
}
然后在您的Service类中调用此静态方法(不在Servlet中,不在Dao中)。