java - 在 Java 中访问多个数据源的一个 SQL 查询(来自 oracle、excel、sql server)

标签 java sql oracle apache-spark-sql apache-drill

我需要开发可以使用一个 SQL 查询 从多个数据源(Oracle、Excel、Microsoft Sql Server 等)获取数据的应用程序。例如:

 SELECT o.employeeId, count(o.orderId) 
    FROM employees@excel e. customers@microsoftsql c, orders@oracle o 
    WHERE o.employeeId = e.employeeId and o.customerId = c.customerId 
    GROUP BY o.employeeId;

此sql和数据源必须由java程序动态更改。 我的客户希望同时从不同的数据库和存储中编写和运行类似sql的查询,并在网络中使用group by、having、count、sum等我的应用程序的界面。 其他要求是性能和轻量级。

我找到了这样做的方法(以及我看到的缺点,如果我错了,请修复我):

  1. Apache Spark (缺点:沉重的解决方案,对大数据更好, 如果您需要在不缓存的情况下获取最新信息,则速度较慢 在 Spark 中),

  2. SQL server 中的分布式查询(Database link of OracleLinked server of Microsoft SQL ServerPower Query of Excel)-缺点: 通过java程序动态更改数据源的问题和 使用 Excel 时遇到问题,

  3. Prestodb (缺点:沉重的解决方案,更适合大数据),

  4. Apache Drill (缺点:相当年轻的解决方案,有些问题没有 最新的 odbc 驱动程序和一些工作时的错误),

  5. Apache Calcite (Apache Drill 使用的轻型框架, 缺点:还很年轻的解决方案),

  6. 手动从数据源加入(缺点:大量工作 开发正确的连接,在结果集中“分组依据”,找到最佳执行计划等)

可能是,您是否知道任何其他方式(使用免费开源解决方案)或根据您对上述方式的经验给我任何建议?任何帮助将不胜感激。

最佳答案

UnityJDBC是一个商业 JDBC 驱动程序,它包装了多个数据源并允许您将它们视为同一个数据库的一部分。它的工作原理如下:

您定义一个“架构文件”来描述您的每个数据库。模式文件类似于:

...
<TABLE>
    <semanticTableName>Database1.MY_TABLE</semanticTableName>
    <tableName>MY_TABLE</tableName>
    <numTuples>2000</numTuples>
 <FIELD>
    <semanticFieldName>MY_TABLE.MY_ID</semanticFieldName>
    <fieldName>MY_ID</fieldName>
    <dataType>3</dataType>
    <dataTypeName>DECIMAL</dataTypeName>
    ...

您还有一个中央“源文件”,它引用您所有的架构文件并提供连接信息,它看起来像这样:

<SOURCES>
    <DATABASE>
        <URL>jdbc:oracle:thin:@localhost:1521:xe</URL>
        <USER>scott</USER>
        <PASSWORD>tiger</PASSWORD>
        <DRIVER>oracle.jdbc.driver.OracleDriver</DRIVER>
        <SCHEMA>MyOracleSchema.xml</SCHEMA>
    </DATABASE>
    <DATABASE>
        <URL>jdbc:sqlserver://localhost:1433</URL>
        <USER>sa</USER>
        <PASSWORD>Password123</PASSWORD>
        <DRIVER>com.microsoft.sqlserver.jdbc.SQLServerDriver</DRIVER>
        <SCHEMA>MySQLServerSchema.xml</SCHEMA>
    </DATABASE> 
</SOURCES>

然后您可以使用 unity.jdbc.UnityDriver 让您的 Java 代码运行跨数据库连接的 SQL,如下所示:

String sql = "SELECT *\n" +
"FROM MyOracleDB.Whatever, MySQLServerDB.Something\n" +
"WHERE MyOracleDB.Whatever.whatever_id = MySQLServerDB.Something.whatever_id";
stmt.execute(sql);

所以看起来 UnityJDBC 提供了您需要的功能,但是,我不得不说,任何允许用户执行任意 SQL 以跨不同数据库连接表的解决方案听起来都像是一个食谱你的数据库屈服了。我实际上会根据您的要求类型推荐的解决方案是 ETL从所有数据源处理到单个 data warehouse 并允许您的用户查询;如何定义这些流程和您的数据仓库对于 stackoverflow 问题来说肯定太宽泛了。

关于java - 在 Java 中访问多个数据源的一个 SQL 查询(来自 oracle、excel、sql server),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34898269/

相关文章:

java - GUI编程-定制框架

java - Gottox socket.io-java-client “握手时出错,由 : java. io.FileNotFoundException : http://192. 168.1.69 :8080/socket. io/1/引起

java - 单击后退按钮时滑动加载的图像会重置

java - EclipseLink 在 Oracle DB 上生成重复的主键

java - 迭代表单元素 htmlunit

Sqlite 获取在每个 SELECT 请求中找到的记录的 ROW NUMBER 和 COUNT

mysql - 最近 7 天的最后时间戳

mysql - 我怎样才能用2个表进行这个MYSQL查询

sql - SQL中如何实现tidyr的complete()?

php - 数据库设计一对一关系