java - 使用带有 Servlet 的 BlockingQueue 来保存对象

标签 java servlets concurrency

首先,这可能是一个愚蠢的问题,但我希望有人能告诉我,以及为什么。如果我对内容/原因的解释有所欠缺,我也深表歉意。

我正在使用 servlet 上传一个巨大的 (247MB) 文件,该文件由管道 (|) 分隔。我抓取 20 个字段中的大约 5 个字段,创建一个对象,然后将其添加到列表中。完成此操作后,我将列表传递给名为 persistList() 的 OpenJPA 事务方法。

这没什么问题,除了文件的大小。这需要很长时间,所以我正在寻找一种方法来改进它。我的一个想法是在新线程中将 BlockingQueue 与 persist/persistList 方法结合使用。不幸的是,我的java并发能力有点薄弱。

我想做的事情有意义吗?如果是这样,以前有人做过类似的事情吗?

最佳答案

Servlet 应在短时间内响应请求。在这种情况下,文件内容的持久化需要是一个异步作业,因此:

  1. Servlet 应返回一些有关上传作业、预计完成时间或类似内容的文本。
  2. 上传的内容应该以二进制形式写入某个临时空间,而不是全部保存在内存中。这是多部分发布图书馆工作的常用方式。
  3. 您应该有一个单独的服务来阻止待处理作业队列。一旦它获得工作,它就会处理它。
  4. “作业”只是上传时写入的临时文件的一些句柄...以及任何元数据,例如上传者、作业 ID 等。
  5. 持久服务需要上传大量行,但要使其显得“原子”,要么将中间状态建模为表模型的一部分,要么写入临时空间。
  6. 如果您要写入临时表,然后将所有内容复制到实时表,请记住在数据库级别拥有足够的日志空间和临时空间。
  7. 如果您有完整的 J2EE 堆栈,请考虑将作业队列建模为 JMS 队列,这样恢复就有意义。再次记住,要有适当的 XA 边界,这样所有的行都会持续存在于外部事务中。
  8. 最后,还可以考虑使用状态检查 API 和/或 UI,您可以在其中确定任何特定上传作业的状态:待处理/处理中/已完成。

关于java - 使用带有 Servlet 的 BlockingQueue 来保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6217128/

相关文章:

javascript - 从 select onchange 调用 servlet 并传递值

java - 在多线程环境中生成 PDF

concurrency - 为什么在同一个 goroutine 中使用无缓冲 channel 会导致死锁?

java - java如何选择.JAR库版本

java paint 问题 - 黑色组件

java - 计算数据存储区 AppEngine java 中的对象数量

java - 将 html 页面设置为 servlet 响应

arrays - 使用索引数组并行写入数组

java - 如何获得循环中产生的 char 值的总和?

Java Thread.suspend 精确语义