servlet中可关闭的非线程安全资源

时间:2016-06-25 12:04:17

标签: java multithreading servlets

如果我有

  1. Closeable资源
  2. 创建费用
  3. 不是DataSource
  4. 这不是线程安全的
  5. 用于servlet
  6. 并且希望避免将资源对象包装到线程安全访问中,
  7. 我的选择是什么?

    首先,我考虑过使用ThreadLocal,但ThreadLocalThread似乎都没有在线程死亡时提供通知。 servlet api提供了许多生命周期方法,但不适用于线程。

    这通常是怎么做的?

3 个答案:

答案 0 :(得分:1)

根据您对我提出的澄清问题的回答,我建议开发一个类似于连接池的资源池。主要用例是:

  1. 在应用程序启动时创建资源池。池的大小应设置为exec线程的最大数量。结果是可用资源池。
  2. 从资源池中检出资源。结果是当前线程可以使用的资源,而不用担心多线程问题。
  3. 处理请求时使用资源池。
  4. 将资源签入回池。结果是资源可供其他线程检出。
  5. 销毁资源池。
  6. 您已经可以使用Apache的通用资源池API来实现此功能,Apache Commons Pool

答案 1 :(得分:0)

这实际上取决于资源的性质......

如果它是数据源,管理(打开和关闭)不应该是servlet的 - 它应该是容器。

其他资源可能更适合每个servlet使用一个实例,因此不必担心线程安全。

如果没有进一步的信息,我只能建议servlet听起来不应该负责资源管理。也许您可以声明一个Servlet Context侦听器,它在应用程序启动时创建资源,并在应用程序停止时关闭它?

http://docs.oracle.com/javaee/7/api/index.html?javax/servlet/ServletContextListener.html

答案 2 :(得分:0)

有一个简单的解决方案: 使用对象池。 Apache Commons提供了一个符合您要求的简单实现(参见示例here)。 我们的想法是让一个池管理您的对象。 可以请求,使用然后返回对象。您可以在请求开始时获取实例,并在结束时将其返回池中。 这就是数据库连接池正在执行的过程。