我正在尝试对存储在两个单独的数据库中的数据进行一些分析,其中一个是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本地完成吗?
答案 0 :(得分:0)
您可以尝试的各种策略:
使用Java程序在服务器A上创建一个临时表,然后从服务器B复制所需的数据(使用服务器B上的SELECT和服务器A上的INSERT)。然后在服务器A上执行适当的查询,以将该服务器上已经存在的表与临时表联接在一起。您可能有权在任一服务器上创建临时表。
如果您有权创建一个永久表,请在服务器A上使用该永久表。然后,只要使用一个Java程序进行了更改,就将数据从服务器B复制到服务器A,然后使用另一个Java程序查询它。
将数据从两个表中较小的一个插入到Java程序中的HashMap中,其中HashMap的键是join变量。然后从较大的表中逐行处理结果集,在HashMap中查找联接的条目。
切换到MariaDB并使用CONNECT存储引擎使SQL Server表可用于MySQL查询。
您如何选择策略?这取决于很多事情。您可以从DBA krewe获得多少合作?您的桌子有多大?您是否总是处理所有行,或者有时是子集? (您的示例查询没有WHERE
子句,因此也许您正在处理所有内容。)您可以在JVM实例中获得足够的RAM来容纳整个表吗?您是否需要每小时一次或每周执行多次?每次您要花多少时间?
专业提示:对于类似示例的查询,请首先在两个服务器上都发出SQL命令SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
,这样就不会在您访问时阻止其他程序访问表检索结果集。
答案 1 :(得分:0)
您应该将结果映射到POJO Arraylist,然后合并它们。
您还可以将它们放在第三个数据库中,然后就可以执行任何SQL查询。