2014-10-28 83 views
0

如果假设我在初始化#的ServletContextListener contextInitialized)数据源(如:怎么办时的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部署此应用程序,因为没有数据源,我没有应用程序的部署意义。

+1

可能值得一读:http://stackoverflow.com/questions/4031275/prefered-way-to-handle-java-exceptions-in-servletcontextlistener – DaveH 2014-10-28 16:05:24

回答

2

数据源应该可以从JNDI查找中获得,而不是像这样。我建议你将这些代码封装在一个方法中,而不是从ServletContext中检索它。

问题:如果初始化数据源失败,该怎么办?我如何防止Tomcat部署此应用程序?

contextInitialized中抛出自定义RuntimeException,应用程序将不会部署。


为了取回您的数据源的连接:

//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; 
    } 
} 

,然后在服务类调用此静态方法(不Servlet中,而不是在DAO)。

+0

是不是我在做数据源的JNDI查找?你能否详细解释一下,我怎么从封装代码中检索? – UDPLover 2014-10-28 16:34:52

+0

答复已更新。 – 2014-10-28 16:39:02

+0

为每个数据库连接需求命名数据源查找代价高昂吗?我们不能初始化数据源一次,并将其永久用于新的数据库连接? – UDPLover 2014-10-28 16:41:19

相关问题