如果假设我将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中)。

07-27 18:23