为单个数据源实现DAO

时间:2014-12-05 11:44:27

标签: java jdbc data-access-layer

我将只为我的项目使用单个数据库。非常固定的是,只使用一个数据源(Oracle)。所以我创建了一个Datasource类来创建连接。我将这些方法保持为静态,因为我只使用一个数据源。

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数据库。我该怎么办呢?当我从开发切换到生产时,我想做出微小的改变。

1 个答案:

答案 0 :(得分:2)

如果它只是一个示例/学生/测试项目,我会说它没问题。 getConnection方法可以进入DataSource类。既然你知道你不会改变数据库,那么你就不会遇到问题。

在生产环境中,如果您将DataSource重命名为OracleDatasource并将其设为单身,则会更好。它可以实现一个接口Datasource,它将定义方法getConnection。这样您就可以将DAO类与数据源的实现分离,这意味着您可以轻松切换OracleDatasource,例如MySQLDatasource

虽然这会更好,但最好的方法是使用连接池。您可以实现自己的,但我建议使用互联网上许多广泛使用和支持的库之一。仅举几例:C3P0DBCPHikariCP


关于测试和生产数据库 - 这里要做的是拥有两个(或更多)属性文件,每个数据库都有连接参数。在生产环境中进行部署时,只需切换属性文件即可。您的实现已经支持。

如果要在Tomcat上进行部署并使用内置的连接池,则必须在生产服务器和测试服务器上配置JNDI资源,以便它们将每个资源指向正确的数据库。设置完成后,您不必再担心了。

如果您正在使用库并从属性文件中读取连接参数,则可以将其放在应用程序服务器根目录的lib文件夹中,因为该文件夹位于所有类的路径中已部署的应用一旦该属性文件到位,应用程序将读取它并连接到定义的数据库。