关闭 ApplicationContext 总是(在使用后)是个好主意吗?
Is closing an ApplicationContext always (after its use) a good idea?
我正在开发 Spring 批处理应用程序,我是否已将 spring xml 配置分类为 4 个文件。前 2 个文件包含 spring 批处理数据库和核心应用程序 bean 定义(即 database.xml
和 context.xml
)。接下来的 2 个文件是动态的,从某种意义上说,它们取决于要执行的批处理脚本。
因此执行批处理脚本包括加载 context.xml
、database.xml
+ 2 个脚本相关文件。
例如,要执行 "batch script 1",我必须加载 batch1.xml
和 tasklet1.xml
以及 2 个核心配置,以执行 "batch script 2",我必须加载 batch2.xml
和 tasklet2.xml
以及 2 个核心配置等等..
由于这种情况,当收到对 运行 批处理脚本的请求时,我需要创建一个新的 ApplicationContext
。现在,一旦我创建并使用我的 ApplicationContext
,我就会通过调用 close()
方法来销毁它们。我的问题是,为每个 运行 创建和销毁 ApplicationContext
是一个好主意(性能和内存方面)吗?或者有什么好的替代方法吗?
编辑:我已经在使用分层上下文。这意味着,对于 2 个核心配置,我正在创建一个 ApplicationContext 并将其保存在内存中(静态变量)。对于一个新请求,我正在创建一个新的 ApplicationContext 并将核心上下文作为父级。
public void runBatch(String batchXmlLoc, String taskletXmlLoc) {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{batchXmlLoc, taskletXmlLoc}, getParent());
//... do the work...
((ClassPathXmlApplicationContext)context).close();
}
private static ApplicationContext parent;
private ApplicationContext getParent() {
if(parent == null) {
parent = new ClassPathXmlApplicationContext("database.xml", "context.xml");
}
return parent;
}
除非您需要在使用后重新启动上下文(这无论如何都会指示编码错误),否则您可以简单地使用分层上下文。
使用您的数据库和核心定义创建根上下文,然后使用以下构造函数创建两个子上下文:
public ClassPathXmlApplicationContext(String[] configLocations,
ApplicationContext parent)
两个子上下文不会互相看到或干扰。
如果您需要重新启动上下文,您应该考虑重构您的设置。 spring 上下文不应该包含任何像这样的状态信息。一个可能的解决方案可能是创建一个工厂 bean,它采用 运行 参数并为批处理 运行.
构建必要的 类
我正在开发 Spring 批处理应用程序,我是否已将 spring xml 配置分类为 4 个文件。前 2 个文件包含 spring 批处理数据库和核心应用程序 bean 定义(即 database.xml
和 context.xml
)。接下来的 2 个文件是动态的,从某种意义上说,它们取决于要执行的批处理脚本。
因此执行批处理脚本包括加载 context.xml
、database.xml
+ 2 个脚本相关文件。
例如,要执行 "batch script 1",我必须加载 batch1.xml
和 tasklet1.xml
以及 2 个核心配置,以执行 "batch script 2",我必须加载 batch2.xml
和 tasklet2.xml
以及 2 个核心配置等等..
由于这种情况,当收到对 运行 批处理脚本的请求时,我需要创建一个新的 ApplicationContext
。现在,一旦我创建并使用我的 ApplicationContext
,我就会通过调用 close()
方法来销毁它们。我的问题是,为每个 运行 创建和销毁 ApplicationContext
是一个好主意(性能和内存方面)吗?或者有什么好的替代方法吗?
编辑:我已经在使用分层上下文。这意味着,对于 2 个核心配置,我正在创建一个 ApplicationContext 并将其保存在内存中(静态变量)。对于一个新请求,我正在创建一个新的 ApplicationContext 并将核心上下文作为父级。
public void runBatch(String batchXmlLoc, String taskletXmlLoc) {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{batchXmlLoc, taskletXmlLoc}, getParent());
//... do the work...
((ClassPathXmlApplicationContext)context).close();
}
private static ApplicationContext parent;
private ApplicationContext getParent() {
if(parent == null) {
parent = new ClassPathXmlApplicationContext("database.xml", "context.xml");
}
return parent;
}
除非您需要在使用后重新启动上下文(这无论如何都会指示编码错误),否则您可以简单地使用分层上下文。 使用您的数据库和核心定义创建根上下文,然后使用以下构造函数创建两个子上下文:
public ClassPathXmlApplicationContext(String[] configLocations,
ApplicationContext parent)
两个子上下文不会互相看到或干扰。
如果您需要重新启动上下文,您应该考虑重构您的设置。 spring 上下文不应该包含任何像这样的状态信息。一个可能的解决方案可能是创建一个工厂 bean,它采用 运行 参数并为批处理 运行.
构建必要的 类