2014-10-28 84 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

相關問題