终止 CycAPI Cyc 连接的首选方法是什么?
What is the preferred way to terminate a CycAPI Cyc connection?
在 The Cyc API example code page 处的 Cyc API 示例代码中,System.exit() 用于终止 Cyc 连接。总的来说,这好像是在用木槌敲鸡蛋。是否有更狭窄的方式来终止维护 Cyc 连接的线程,以便简单地落到 main 的末尾(例如)导致程序终止?
(免责声明:我是 Cyc APIs 的开发者之一...)
终止连接比早期版本的 Cyc Core APIs 更困难,但 1.0.0-rc4 版本增加了一些功能来解决这个问题。
Session API 的 SessionManager 旨在最终负责监督连接池管理。连接可以跨会话重用,在大多数情况下,您不必担心直接创建、缓存或关闭与 Cyc 服务器的连接。基本原理是这样的:底层的 CycAccess 连接实际上是相当重量级的(创建一个可能需要 100 毫秒或更多),因此您不想随便终止它们,并且您可能不希望直接管理它们的麻烦,例如, servlets 等多线程环境。
通常情况下,您只需要在完成单个 CycSession 后关闭它们;一旦没有资源依赖它,SessionManager 将关闭底层连接。 CycSession 接口扩展 java.io.Closeable,因此您可以执行以下操作:
try {
// Some calls to KB API, Query API, etc...
} finally {
CycSessionManager.getCurrentSession().close();
}
在 Java 7 及更高版本中,这意味着 CycSessions 实现 java.lang.AutoCloseable,因此您可以将它们包装在 try-with-resources 语句中:
try (CycSession session = CycSessionManager.getCurrentSession()) {
// Some calls to KB API, Query API, etc...
}
// The session has been automatically closed. The next call will return a new session:
CycSession newSession = CycSessionManager.getCurrentSession();
也可以关闭 SessionManager,强制它关闭 所有 连接。这在例如退出应用程序时很有用:
public static void main(String[] args) throws IOException {
try (SessionManager sessionMgr = CycSessionManager.getInstance()) {
// Some calls to KB API, Query API, etc...
}
}
或者,您可以手动关闭它:
try {
// Some calls to KB API, Query API, etc...
} finally {
CycSessionManager.getInstance().close();
}
一旦 SessionManager 实例关闭,它就不能再用于创建或检索会话。但是,您可以指示 CycSessionManager 加载一个新的 SessionManager 实例:
CycSessionManager.getInstance().close();
CycSessionManager.getInstance().isClosed(); // true
CycSessionManager.reloadInstance();
CycSessionManager.getInstance().isClosed(); // false
在CycSessionManager#reloadInstance()之前调用SessionManager#close()实际上是多余的(尽管无害); reloadInstance 确保先前的 SessionManager 在替换它之前已关闭。无论如何,我通常不建议编写严重依赖重新加载 SessionManager 的代码(出于上述原因),但如果您需要它,它就在那里。
这就是它的要点。这里有进一步的文档:http://dev.cyc.com/api/core/session/connection-management/
在 The Cyc API example code page 处的 Cyc API 示例代码中,System.exit() 用于终止 Cyc 连接。总的来说,这好像是在用木槌敲鸡蛋。是否有更狭窄的方式来终止维护 Cyc 连接的线程,以便简单地落到 main 的末尾(例如)导致程序终止?
(免责声明:我是 Cyc APIs 的开发者之一...)
终止连接比早期版本的 Cyc Core APIs 更困难,但 1.0.0-rc4 版本增加了一些功能来解决这个问题。
Session API 的 SessionManager 旨在最终负责监督连接池管理。连接可以跨会话重用,在大多数情况下,您不必担心直接创建、缓存或关闭与 Cyc 服务器的连接。基本原理是这样的:底层的 CycAccess 连接实际上是相当重量级的(创建一个可能需要 100 毫秒或更多),因此您不想随便终止它们,并且您可能不希望直接管理它们的麻烦,例如, servlets 等多线程环境。
通常情况下,您只需要在完成单个 CycSession 后关闭它们;一旦没有资源依赖它,SessionManager 将关闭底层连接。 CycSession 接口扩展 java.io.Closeable,因此您可以执行以下操作:
try {
// Some calls to KB API, Query API, etc...
} finally {
CycSessionManager.getCurrentSession().close();
}
在 Java 7 及更高版本中,这意味着 CycSessions 实现 java.lang.AutoCloseable,因此您可以将它们包装在 try-with-resources 语句中:
try (CycSession session = CycSessionManager.getCurrentSession()) {
// Some calls to KB API, Query API, etc...
}
// The session has been automatically closed. The next call will return a new session:
CycSession newSession = CycSessionManager.getCurrentSession();
也可以关闭 SessionManager,强制它关闭 所有 连接。这在例如退出应用程序时很有用:
public static void main(String[] args) throws IOException {
try (SessionManager sessionMgr = CycSessionManager.getInstance()) {
// Some calls to KB API, Query API, etc...
}
}
或者,您可以手动关闭它:
try {
// Some calls to KB API, Query API, etc...
} finally {
CycSessionManager.getInstance().close();
}
一旦 SessionManager 实例关闭,它就不能再用于创建或检索会话。但是,您可以指示 CycSessionManager 加载一个新的 SessionManager 实例:
CycSessionManager.getInstance().close();
CycSessionManager.getInstance().isClosed(); // true
CycSessionManager.reloadInstance();
CycSessionManager.getInstance().isClosed(); // false
在CycSessionManager#reloadInstance()之前调用SessionManager#close()实际上是多余的(尽管无害); reloadInstance 确保先前的 SessionManager 在替换它之前已关闭。无论如何,我通常不建议编写严重依赖重新加载 SessionManager 的代码(出于上述原因),但如果您需要它,它就在那里。
这就是它的要点。这里有进一步的文档:http://dev.cyc.com/api/core/session/connection-management/