使用带有Servlet的阻塞队列来持久化对象



首先,这可能是一个愚蠢的问题,但我希望有人能告诉我,以及为什么。如果我没有解释什么/为什么,我也很抱歉。

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

这是可以的,除了文件的大小。这需要很长时间,所以我正在寻找改进它的方法。我的一个想法是在一个新线程中使用BlockingQueue和persisten/persistList方法。不幸的是,我在java并发方面的技能有点弱。

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

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

  1. servlet应该用一些关于上传作业、预期完成时间或类似内容的文本进行响应
  2. 上传的内容应该以二进制形式写入一些临时空间,而不是全部保存在内存中。这是由多部分组成的后库进行工作的常用方式
  3. 您应该有一个单独的服务来阻塞挂起作业的队列。一旦它得到一份工作,它就会处理它
  4. "作业"只是上传时写入的临时文件的一些句柄。。。以及任何元数据,如上传者、作业id等
  5. 持久化服务需要上传大量行,但要使其看起来"原子",要么将中间状态建模为表模型的一部分,要么写入临时空间
  6. 如果您正在写入临时表,然后将所有内容复制到活动表,请记住在数据库级别有足够的日志空间和临时空间
  7. 如果您有一个完整的J2EE堆栈,请考虑将作业队列建模为JMS队列,这样恢复就有意义了。再一次,记住要有适当的XA边界,这样所有的行都会保留在一个外部事务中
  8. 最后,还要考虑对API和/或UI进行状态检查,在那里您可以确定任何特定上传作业的状态:Pending/Processing/Completed

最新更新