【问题标题】:Implementing DAO for a single datasource为单个数据源实现 DAO
【发布时间】:2015-02-03 13:59:03
【问题描述】:

我将只为我的项目使用单个数据库。仅使用一个数据源(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 数据库。我该怎么做呢?当我从开发切换到生产时,我想进行最小的更改。

【问题讨论】:

  • 适合您的应用的设计就是好的设计。

标签: java jdbc data-access-layer


【解决方案1】:

如果它只是一个示例/学生/测试项目,我会说没关系。 getConnection 方法可以进入DataSource 类。而且由于您知道不会更改数据库,因此不会有任何问题。

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

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


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

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

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

【讨论】:

  • 关于连接池,为什么会有库,在tomcat中创建连接池的时候就这么简单。使用这些库而不是在 context.xml、web.xml 中添加条目并通过 jndi 查找获取数据源是否有一些优势。
  • 请在最后看到我的新问题。
  • 通过库配置就像配置Tomcat连接池一样简单。你也可以看看这个问题stackoverflow.com/q/20955875/1212463
  • 我也在考虑使用缓存(EHCache),但没有找到任何地方,在哪里以及如何在我的应用程序中使用缓存。你能推荐点什么吗?
  • 我不是这方面的专家,恐怕你以后只能靠自己了。我敢肯定有很多关于缓存的文章,所以你可以用谷歌搜索一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2016-06-18
相关资源
最近更新 更多