2012-08-15 34 views
1

对于我正在处理的胖客户端项目,我必须远程连接到数据库(IBM i系列)并执行一些SQL相关任务:SQL新手 - 查询的组织和优化

  1. Download/Update a set of local/offline 'control' data - 此数据可能在未被注意的运行之间发生变化。
  2. ​​这些表的名称是已知的,但模式名称在运行之间更改,并且可以更改运行间(据我所知,PreparedStatements不允许动态插入模式)。 我曾考虑过使用连接/联合/ etc来执行所有这些查询,但项目要求我在表数据(而不是一个大的连接块)之间进行内存分离。
  3. Perform between 2 and 100+ repetitions of (2)

最后一个因素是,这需要在高延迟运行(潜在拨号)网络连接可能最古老的计算机上使用Java 1.5。

目前我运行15-20动态构建PreparedStatements但我知道这是相当低效(我测量,以避免过早优化ala Knuth)。

什么是执行这些任务的最有效和最容错的方法?
我的想法:

  • 关于(1),我真的不知道比检查对新表整个表等,在这一点上,我觉得我还不如直接下载新的(潜在的和可能不变)表并替换旧的,但这需要更多时间。
  • 对于(2):理想情况下,我可以构建类似于SELECT语句数组的东西,将它们一次全部发送,并让数据库每个内部查询返回一个ResultSet。据我所知,StatementPreparedStatement都不支持返回多个ResultSet对象。
  • 最后,我认为做(3)的最佳方式是批量操作(2)
+0

您可以从运行Java代码在IBM我也可以这样做,并给你一个对象,例如通过RMI。 – 2012-08-15 16:46:28

+0

语句具有getMoreResults()方法,该方法用于读取多个结果集。 (除非你的意思是,你的JDBC驱动程序不支持它,这是可能的) – 2012-08-15 16:53:53

+0

@ThorbjørnRavnAndersen不幸的是我没有访问数据库(一个或多个)本身(客户端可以连接到运行之间的不同DB - 相同的一般结构),只能访问连接对象等等。如果这仍然可行,请介绍更多关于如何操作的细节。 :) – BenCole 2012-08-15 16:54:34

回答

2

移动需求没有什么特别之处,但与大多数数据库交谈时使用的最重要的事情是在Java应用程序中使用连接池并正确使用它。

这也适用于这里。 IBM i DB2/400数据库速度非常快,jt400项目中可用的数据库驱动程序(类型4,没有本机代码)非常好,所以您可以在短时间内将相当多的数据拉过来,只需生成SQL在飞行中。

请注意,如果您只有一个模式,您可以在连接中告诉您需要哪一个模式,然后可以在SQL语句中使用非限定的表名。非常仔细地阅读信息中心的JDBC属性 - 要正确地阅读是有点棘手的。如果您需要多个模式,“命名=系统”允许使用库列表 - 即查找表的模式列表,这在正确完成时非常有用。 IBM我的人可以在这里帮助你。这就是说,如果连接是限制因素,那么可能会有一个非常强大的情况,可以直接在IBM i上运行“从表创建对象”Java代码。您现在应该已经准备好能够测量到数据库的流量 - 无论是使用网络监控工具,使用p6spy还是仅通过代理(可能甚至是一个代理)

+0

到目前为止,我已经通过使用ConnectionPooling和即时生成(第一次优化之一,绝对是最重要的一次),但不幸的是,至少一个'Connection'必须多数使用已知的模式之前创建(只在开始时是已知的,模式的改变取决于用户与用户的选择操作)。 – BenCole 2012-08-15 18:22:50

+0

你会为一个连接池的建议对于Java?(和一个网络监视组件?)而且,虽然只有一个“数据库组”,但他们监视20多个数据库,并且不愿意做出“不必要的”更改。还有其他的选择,我宁愿去探索那些。 – BenCole 2012-08-15 18:28:21

+1

我会建议为你想知道的每件事开个新的问题。 – 2012-08-15 18:59:52

0

理想情况下,您应该让数据库组为您提供一组存储过程,以优化对数据库的访问。

由于您没有访问权限,您可能想询问他们是否在行级别的数据库中有时间戳数据以查看记录何时被修改,这样您就可以只选择自某点以来更改过的数据及时。

@ThorbjørnRavnAndersen建议将数据库代码移到IBM主机上,并通过RMI或JMS从客户机连接到它。因此,服务器代码将是代表您访问数据库的RMI或JMS服务器,并返回给您java对象,而不是通过线路引入SQL结果集。

我会将您的要求传递给数据库团队,看看他们是否无法为您做些什么。我确信他们不希望所有这些远程客户端每次都将数据全部下载,所以这会让他们受益,尽可能多地让他们受益。

+0

不幸的是,虽然只有一个数据库组,但有20多个数据库,并且变化非常令人不满。也许是最后的手段,但只有在没有其他工作的情况下:( – BenCole 2012-08-15 18:25:06