2014-12-05 28 views
0

我將僅爲我的項目使用單個數據庫。只使用一個數據源(Oracle)是相當固定的。所以我創建了一個Datasource類來創建連接。我將這些方法保持爲靜態,因爲我將只使用一個數據源。爲單個數據源實現DAO

public class DataSource { 

static Logger log = Logger.getLogger(DataSource.class); 
static String connectionURL; 
static String userName; 
static String password; 

static { 
    log.debug("Creating ConnectionURL"); 
    Connection conn; 
    Properties properties = new Properties(); 
    try { 
     FileInputStream in = new FileInputStream(getCodesignRoot() + "/DBConnection/config.properties"); 
     properties.load(in); 
    } catch (FileNotFoundException ex) { 
     log.error("config.properties file not found", ex); 
     log.info("SHUTTING DOWN APPLICATION"); 
     System.exit(-1); 
    } catch (IOException ex) { 
     log.error("Can't load the config.properties file", ex); 
     log.info("SHUTTING DOWN APPLICATION"); 
     System.exit(-1); 
    } 

    String databaseServer = properties.getProperty("jdbc.databaseServer"); 
    String listenerPort = properties.getProperty("jdbc.listenerPort");   
    String oracleSID = properties.getProperty("jdbc.oracleSID"); 

    userName = properties.getProperty("jdbc.userName"); 
    password = properties.getProperty("jdbc.userPassword"); 

    connectionURL 
      = "jdbc:oracle:thin:@//" + databaseServer + ":" + listenerPort 
      + "/" + oracleSID; 
}  

最重要的是,我將連接方法設爲靜態。

public static Connection getConnection() throws SQLException { 
    try { 
      Class.forName("oracle.jdbc.driver.OracleDriver"); 
     } catch (ClassNotFoundException ex) { 
      log.error("Driver Not Found", ex); 
      throw new SQLException("Driver Not Found"); 
     } 
     return DriverManager.getConnection(connectionURL, userName, password); 
} 

這是一個很好的設計嗎?我應該在哪裏保持我的getConnection方法?它可以是靜態的,因爲我將只使用一個數據源?

我忘了添加一個部分。如果我必須使用兩個數據庫。一個用於開發,另一個用於生產,都是oracle數據庫。我應該怎麼做?當我從開發切換到生產時,我想做最小的改變。

+0

適合您的應用的設計是一個很好的設計。 – 2014-12-05 11:52:35

回答

2

如果它只是一個示例/學生/測試項目,我會說這沒關係。 getConnection方法可以進入DataSource類。既然你知道你不會改變數據庫,你將不會有問題。

在生產環境中,如果您將DataSource重命名爲OracleDatasource並將其設爲單身人士,則會更好。它可以實現一個接口Datasource,它將定義方法getConnection。這樣,您可以將DAO類從數據源的實現中分離出來,這意味着您可以輕鬆地將OracleDatasource切換爲MySQLDatasource

雖然這樣會更好,但最好的方法是使用連接池。你可以實現你自己的,但我會建議使用互聯網上的許多廣泛使用和支持的庫之一。僅舉幾例:C3P0DBCPHikariCP


關於測試和生產數據庫 - 在這裏做的事情是有兩個(或更多)連接參數爲每個數據庫的屬性文件。在生產環境中部署時,只需切換屬性文件即可。你的實現已經支持。

如果要在Tomcat上部署並使用內置的連接池,則必須在生產服務器和測試服務器上配置JNDI資源,以便它們指向每個正確的數據庫。一旦建立起來,你就不用再擔心了。

如果您正在使用庫並從屬性文件中讀取連接參數,則可以將其放入應用程序服務器根目錄中的lib文件夾中,因爲該文件夾位於所有已部署應用程序的類路徑中。一旦該屬性文件就位,應用程序將讀取它並連接到定義的數據庫。

+0

關於連接池,爲什麼有庫,在tomcat中創建連接池時非常簡單。使用這些庫而不是在context.xml,web.xml中添加條目並通過jndi查找獲取數據源有一些優勢。 – Akhil 2014-12-05 16:35:37

+0

請在結尾處看到我的新問題。 – Akhil 2014-12-05 16:39:38

+1

通過庫的配置與Tomcat連接池一樣簡單。你也可以看看這個問題http://stackoverflow.com/q/20955875/1212463 – lmazgon 2014-12-05 16:44:13