2

我希望我的 Cocoa 应用程序与数据库服务器进行通信。按照应用程序沙盒设计的原则,将数据库通信拆分为 XPC 服务是有意义的。

由于 XPC 服务应该是无状态的,因此包含连接信息的结构(例如MySQL 连接句柄)需要由主应用程序持有并根据需要传递给 XPC 服务。然而,句柄是一种不透明的类型,XPC 服务似乎不支持它——只允许基本的算术/逻辑/集合类型。

是否有某种方法可以将连接句柄(或其他不透明类型)装箱,以便可以将其传递给 XPC 服务?

4

1 回答 1

3

由于 MySQL 连接句柄不是无状态的,并且因为首先将网络代码隔离到 XPC 中的重点是稳定性,所以我不会担心无状态。它被认为是可取的,但这不是必需的。去引用:

Because an XPC service can be terminated suddenly at any time, it must be designed
to hold on to minimal state—ideally, your service should be completely stateless,
although this is not always possible.

XPC 文档

这是并非总是可能的情况之一。MySQL 连接拥有自己的状态,因此如果您想保持无状态,最好的办法是每次都将所有凭据作为原子操作传递给 XPC,这样效率会很低。

相反,我建议您创建某种在您的应用程序和 XPC 之间来回传递的“句柄”,可以在 XPC 内的表中查找以进行验证(如果 XPC 被终止并重新启动它可以判断它被中断并发回错误)。然后,在应用程序端,您可以发送该句柄进行操作,并在必要时通过从 XPC 重新获取“句柄”来重新打开您的内部 API 句柄。这可以直接在进行数据库调用的代码中完成,但如果 XPC 容易死机,那么您可能希望将其放入内部库并维护凭证,以便您可以重新启动 XPC 并重新启动连接而不打扰更高级别的代码。

无论哪种方式,您都希望在 SQL 事务级别保持对 XPC 的调用,因为 MySQL 连接可能会在对 XPC 的调用之间中止,这会导致回滚,您必须重新开始。

于 2013-06-08T22:11:02.087 回答