java - 为特定 DBMS(数据库引擎)动态设置数据源的正确方法是什么?

标签 java database compiler-errors datasource

我有一个项目需要连接到数据库。我正在从 config.xml 文件中读取数据库连接信息,但是,我陷入了为特定数据库引擎定义数据源的部分(从技术上讲,它是 dbms,但这些术语似乎可以互换使用) )。这是相关的代码片段:

String engine = get(xmldoc, "engine");
if (engine == "postgres")
{
    PGSimpleDataSource ds = new PGSimpleDataSource();
}
else if (engine == "mssql")
{
    SQLServerDataSource ds = new SQLServerDataSource();
}
else if (engine == "sqlite")
{
    SQLiteDataSource ds = new SQLiteDataSource();
}
else
{
    throw new Exception(String.format("Unknown DBMS type %s", engine));
}

ds.setServerName(get(xmldoc, "hostname"));
ds.setDatabaseName(get(xmldoc, "databasename"));
ds.setUser(get(xmldoc, "username"));

当我尝试编译它时,对于每个对 ds 的引用,我都会收到一堆错误:找不到符号。经过一番挖掘,我发现这是因为我的 ds 变量是声明它的 if 语句的本地变量(引用: Cannot find symbol if statement error )。但与该问题不同的是,我不能简单地在开始时声明它,因为我不知道它将是什么特定的数据源。

那么,动态设置数据源的最佳方法是什么?最好不要将所有初始化代码放入每个 if 语句中,因为那样我也必须将所有数据库调用都放在那里。是否有某种方法可以首先将 ds 声明为通用数据源,然后将其转换为 if 语句中的特定数据源?

最佳答案

首先,您比较字符串的方式是错误的:

但是解决真正问题的方法是使用多态性。

  1. 您需要定义一个 DataSource 接口(interface)来声明您的应用程序将调用的所有方法。

  2. 所有现有的数据库特定数据源类都需要实现 DataSource 接口(interface)及其方法。 (也许您可以使用抽象类来实现一些常见功能。)

  3. ds 声明为 DataSource;例如

    String engine = get(xmldoc, "engine");
    DataSource ds = null;
    if (engine.equals("postgres")) {
        ds = new PGSimpleDataSource();
    }
    else if (engine.equals("mssql")) {
        ds = new SQLServerDataSource();
    }
    else if (engine.equals("sqlite")) {
        ds = new SQLiteDataSource();
    }
    else {
        throw new Exception(String.format("Unknown DBMS type %s", engine));
    }
    
    ds.setServerName(get(xmldoc, "hostname"));
    ds.setDatabaseName(get(xmldoc, "databasename"));
    ds.setUser(get(xmldoc, "username"));
    

上述问题是标准DataSource接口(interface)和类没有实现您想要使用的方法。因此,您必须为 PGSimpleDataSourceSQLServerDataSource 等创建自己的接口(interface)和包装类。

(您确定要自己编写这段代码吗?找到并使用现有的库不是更好吗?或者如果只是设置服务器名称、数据库和用户,请在其中进行“连接”配置if/else 分支使用源特定的 API 方法。)

关于java - 为特定 DBMS(数据库引擎)动态设置数据源的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59257255/

相关文章:

java - SpotBugsTask : java. lang.NoSuchMethodError : 'java. lang.Object org.gradle.util.DeprecationLogger

java - 将文件读入 Derby 数据库

ios - 错误: Invalid conversion from throwing function of type '(_) throws -> ()' to non-throwing function type '(DataSnapshot) -> Void'

database - 用户表数据库最佳实践

java - 如何从它本身(也是主类)更新GUI?

linux - 来自 C++ 头文件的奇怪的 g++ 编译器错误

java - ColdFusion MX - 从 url 中删除 jsessionid

java - Hibernate @事务 session

java - 如何从 Java 中的 while 循环返回 count 的值

mysql - Node.js,插入后未显示在列表查询中