如果我在 Java 中查询,如何组合来自 mssql 数据库和 mysql 数据库的数据?

Posted

技术标签:

【中文标题】如果我在 Java 中查询,如何组合来自 mssql 数据库和 mysql 数据库的数据?【英文标题】:How can I combine data from a mssql database and a mysql database if I am querying in Java? 【发布时间】:2019-11-16 07:49:17 【问题描述】:

我正在尝试对存储在两个单独数据库中的数据进行一些分析,其中一个是 mysql 服务器,另一个是 mssql。它们需要基于其中一列连接,因此我最终得到一个数据结构。

我尝试将数据单独存储到 python 中的 pandas 数据帧中,将它们加入 pandas,然后写入 csv 并将其加载回 java。但这做起来很麻烦,而且可扩展性也不强。

本质上,我有两个这样的查询:

MySQL

String myDriver = "org.gjt.mm.mysql.Driver";
String myUrl = "jdbc:mysql://localhost/test";
Class.forName(myDriver);
Connection conn = DriverManager.getConnection(myUrl, "root", "");
String query = "SELECT * FROM users";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(query);

mssql

String url = "jdbc:msql://someMSsqlserver/";
Connection conn = DriverManager.getConnection(url,"","");
Statement stmt = conn.createStatement();
ResultSet rs;
rs = stmt.executeQuery("SELECT * FROM people");

我希望将它们连接到一个数据结构中。无论如何,这可以在 Java 中本地完成吗?

【问题讨论】:

并非没有在 java 中手工完成。您可以将表从一个数据库复制到另一个数据库吗? 我不太可能获得这样做的权限。可以以任何可行的方式组合结果集吗?还是需要将它们转换为其他对象然后使用? MySQL 的 MariaDB 分支拥有一个 CONNECT 存储引擎,允许在 MariaDB 服务器上的 SQL 查询中使用 SQL Server 上的表。 mariadb.com/kb/en/library/… 要使用它,您需要使用 MariaDB、对 MariaDB 的管理员访问权限以及对 SQL Server 数据库的 ODBC 样式访问权限。 “无论如何,这可以在 Java 中本地完成吗?” 是的。现在阅读Why is “Is it possible to…” a poorly worded question? 不容易。卷起袖子。 【参考方案1】:

您应该将结果映射到 POJO Arraylist,然后将它们合并。

你也可以把它们放在第三个数据库中,然后你就可以做任何sql查询了。

【讨论】:

【参考方案2】:

您可以尝试的各种策略:

    使用您的 Java 程序在服务器 A 上创建一个临时表,然后从服务器 B 复制您需要的数据(在服务器 B 上使用 SELECT 并在服务器 A 上使用 INSERT)。然后在服务器 A 上执行适当的查询,以将该服务器上已有的表与临时表连接起来。您可能有权在任一服务器上创建临时表。

    如果您有权创建永久表,请在服务器 A 上使用永久表。然后,每当数据被一个 Java 程序更改时,将数据从服务器 B 复制到服务器 A,并使用另一个 Java 程序查询它。

    将两个表中较小的一个表中的数据放入 Java 程序中的 HashMap 中,其中 HashMap 的键是连接变量。然后逐行处理较大表中的结果集,在 HashMap 中查找连接条目。

    切换到 MariaDB 并使用 CONNECT 存储引擎使您的 SQL Server 表可用于您的 MySQL 查询。

您如何选择策略?这取决于很多事情。您可以从您的 DBA krewe 那里获得多少合作?你的桌子有多大?你总是处理所有的行,或者有时是一个子集吗? (您的示例查询没有WHERE 子句,所以也许您正在处理所有内容。)您能否在JVM 实例中获得足够的RAM 来容纳整个表?您需要每小时执行多次,还是每周执行一次?每次做一次大概需要多少时间?

专业提示:对于像您的示例这样的查询,请先给出 SQL 命令 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;(在两种服务器上),这样您就不会在检索您的数据时阻止其他程序访问您的表结果集。

【讨论】:

以上是关于如果我在 Java 中查询,如何组合来自 mssql 数据库和 mysql 数据库的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在哈姆雷特的列表中组合来自单独查询的“详细信息”?

如何编写猫鼬查询来组合来自两个模型的数据?

访问查询/组合框

如何在第三个查询中包含来自其他两个表的过滤行数?

如何根据组合框选择过滤datagridview

组合来自 2 个单独的 SQL 表的列数据