跨不同类共享对象

时间:2017-08-21 08:43:50

标签: java jdbc

我需要一些" design"建议。我有静态JDBC对象和我的主要入口类"其他类共享。

我的MainClass看起来像这样:

public static Jdbc db1;
public static Jdbc db2;

connectDb(makeDirectConnection) // depending on runtime passed argument

public static connectDb(boolean makeDirectConnection) {
if(makeDirectConnection) // use direct connection
    db1 = JdbcFactory.getInstance("db/config/main/db1.properties");
    db2 = JdbcFactory.getInstance("db/config/main/db2.properties");
} else { // connect using via SSH tunnel (different host and port)
    db1 = JdbcFactory.getInstance("db/config/tunnel/db1.properties");
    db2 = JdbcFactory.getInstance("db/config/tunnel/db2.properties");
}

JdbcFactory维护Map个实例。

它有点可行,但是如果我想对正在使用db1db2的类进行单元测试,如果从单元测试我不做{我得到空指针异常{1}}

让事情变得更糟 - 从测试类我甚至需要一个不同的数据库设置,所以从MainClass.dbConnect()我做:

Test.class

所有这一切都很混乱,我不喜欢。如何分享Main.db1 = JdbcFactory.getInstance("db/config/test/db1.properties"); db1,是不是有更好的方法?

从java run参数定义的db2也阻止我使用boolean makeDirectConnection finaldb1。任何建议如何解决这个问题? (这取决于程序执行的环境 - 但我不想让它可靠的主机名或其他操作系统的东西。

2 个答案:

答案 0 :(得分:1)

我不会提供一个布尔值作为jvm参数来区分你的两个(或三个)情况。相反,我会通过参数提供数据库网址。在这种情况下,您还可以使用“test-db.properties”在测试中调用您的方法。

答案 1 :(得分:1)

由于您需要为测试和部署而不同地设置默认实例。因此,请创建一个property file,其中提到应使用哪个文件为db1db2创建默认实例。

要从单元测试代码中删除调用MainClass.dbConnect()的需要,只需创建一个静态块,然后使用默认值初始化db1db2。例如如果属性文件为defaultDB.properties且具有以下内容:

DB1=db/config/test/db1.properties
DB2=db/config/test/db2.properties

然后使用以下内容:

static private Properties prop;
static {
    prop = new Properties();
    prop.load(new FileInputStream("defaultDB.properties"));
    db1 = JdbcFactory.getInstance(prop.getProperty("DB1"));
    db2 = JdbcFactory.getInstance(prop.getProperty("DB2"));
}