【发布时间】:2014-09-15 14:37:19
【问题描述】:
我正在我的 java 应用程序中执行以下一组语句。它连接到一个 oracle 数据库。
stat=connection.createStatement();
stat1=commection.createstatement();
ResultSet rs = stat.executeQuery(BIGQUERY);
while(rs.next()) {
obj1.setAttr1(rs.getString(1));
obj1.setAttr2(rs.getString(1));
obj1.setAttr3(rs.getString(1));
obj1.setAttr4(rs.getString(1));
ResultSet rs1 = stat1.executeQuery(SMALLQ1);
while(rs1.next()) {
obj1.setAttr5(rs1.getString(1));
}
ResultSet rs2 = stat1.executeQuery(SMALLQ2);
while(rs2.next()) {
obj1.setAttr6(rs2.getString(1));
}
.
.
.
LinkedBlockingqueue.add(obj1);
}
//all staements and connections close
BIGQUERY 返回大约 450 万条记录,对于每条记录,我必须执行较小的查询,数量为 14。每个小查询都有 3 个内部连接语句。
我的多线程应用程序现在可以在一小时内处理 90,000 个。但我可能必须每天运行代码,所以我想在 20 小时内处理所有记录。我正在使用大约 200 个线程来处理上述代码并将记录存储在链接阻塞队列中。
盲目地增加线程数有助于提高性能还是有其他方法可以提高结果集的性能?
PS:我无法在此处发布查询,但我确信所有查询都已优化。
【问题讨论】:
-
为什么要在 Java 中实现连接?数据库将更有效地做到这一点。
-
对不起,应该已经很清楚了。 BIGQUERY 是一个有连接的 sql 语句,我只是在执行它。
-
我不是在谈论 bigquery 中的联接。您的代码实现了 bigquery 和 smallq1 之间的嵌套循环连接以及 bigquery 和 smallq2 之间的另一个嵌套循环连接。与您使用 Java/JDBC 创建的任何解决方案相比,数据库可以做的事情很多 (Oracle 也可以为您做多线程)。为循环的每次迭代在循环内运行 sql 语句应该会敲响 很多 个警钟。
-
我假设您的 BIGQRY 和 SMALLQRYx 具有不容易实现纯 sql 的功能和依赖关系,这就是您进行客户端杂耍的原因。您可以将多个 SMALLQRYx 批处理到同一个查询语句吗? JdbcDriver+DB 可能不支持返回多个结果集,但是如果 smalls 或多或少相似的选择查询,请使用“SELECT 1 as smallidx, col1, col2..UNION ALL..SELECT 2 as smallidx, col1, col2...”?
-
尝试 UNIONALL_BATCH 技巧,如果有所作为,extracol 告诉客户端循环该行所属的位置。在 t1.attr1=t2.attr1 和 t2.attr2='VALUE1' 内连接 table3 t3 on t1.attr1=t3.attr1 和 t1.attr1=t3.attr2= 'VALUE2' and t1.attr3='VALUE3' UNION ALL select 2 as smallidx, attr1, attr2, attr3 from table1 t1 inner join table2 t2 on t1.attr1=t2.attr1 and t2.attr2='VALUE4' inner join table3 t3在 t1.attr1=t3.attr1 和 t3.attr2='VALUE5' 和 t1.attr3='VALUE6' UNION ALL ...VALUE7+VALUE8+VALUE9
标签: java sql multithreading jdbc