1

对于我正在处理的胖客户端项目,我必须远程连接到数据库(IBM i 系列)并执行一些与 SQL 相关的任务:

  1. Download/Update a set of local/offline 'control' data- 此数据可能在未注意到的运行之间发生了变化。
  2. On command, download data from multiple (15-20) tables and store separately into a single Java object. 表的名称是已知的,但是模式名称在运行之间会发生变化,并且可以在运行之间发生变化(据我所知,PreparedStatements不允许动态插入模式)。我曾考虑使用 joins/unions/etc 将所有这些查询作为一个来执行,但该项目要求我在表数据之间进行内存分离(而不是一个大的连接块)。
  3. Perform between 2 and 100+ repetitions of (2)

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

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

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

  • 关于(1),除了对照新表检查整个表之外,我真的不知道,此时我觉得我不妨下载新的(可能且可能未更改的)表并替换旧表,但这需要更多时间。
  • For (2):理想情况下,我能够构建类似于一组SELECT语句的东西,一次发送它们,并让数据库ResultSet为每个内部查询返回一个。但是,据我了解,既不Statement也不PreparedStatement支持返回多个ResultSet对象。
  • 最后,我能想到的最好方法(3)是批量(2)操作。
4

2 回答 2

2

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

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

请注意,如果您只有一个模式,您可以在连接中告诉您需要哪个模式,然后可以在 SQL 语句中使用非限定表名。非常仔细地阅读 InfoCenter 中的 JDBC 属性 - 正确阅读有点棘手。如果您需要多个模式,“naming=system”允许库列表 - 即用于查找表的模式列表,如果正确完成,这将非常有用。IBM i 人员可以在这里为您提供帮助。

也就是说,如果连接是限制因素,那么您可能非常有理由直接在 IBM i 上运行“从表中创建对象”Java 代码。您现在应该已经准备好能够测量到数据库的流量 - 使用网络监控工具、使用 p6spy 或简单地通过代理(甚至可能是一个节流的代理)

于 2012-08-15T17:15:50.720 回答
0

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

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

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

我会将您的要求传递给数据库团队,看看他们是否不能为您做点什么。我敢肯定,他们不希望所有这些远程客户端每次都关闭所有数据,因此这对他们有好处,对你也有好处。

于 2012-08-15T17:08:56.987 回答