我有一个平面文件,说一个50mb的csv文件,其中包含结构化数据,我需要读取它们,然后需要压入一个数据库中,例如MySQL。一种方法是将文件拆分为多个文件,然后使用执行程序并行处理。好的现在,如果有第二个用例,如果任何一个数据不正确,我需要停止处理所有线程,这意味着如果在csv中找到的任何一个数据不正确,我们就不应处理该事务。我需要第二部分的想法。
谢谢, RK
答案 0 :(得分:0)
请使用ThreadGroup
。
public static void main(String... args) {
final ThreadGroup group = new ThreadGroup("Thread Group");
new Thread(group, () -> {
// payload
group.interrupt();
}).start();
new Thread(group, () -> {
// payload
group.interrupt();
}).start();
}
答案 1 :(得分:0)
对于50MB,添加多个线程会使该设计复杂化。平面文件或JSON之类的结构化数据可以更快地通过单个线程在几秒钟内完成。旋转多个线程以获取50MB数据实在是太过分了。在很多情况下,我已经使用单线程处理了400+ MB的JSON或CSV数据的相同用例。
您还必须考虑到您正在写入单个数据库,在这种情况下,由于您有多个事务,因此多个线程会使事情复杂化。以您的CSV示例为例,听起来您打算让每个线程负责读取一行或多行并将其写入数据库?在这种情况下,每个线程都在其自己的JDBC事务中运行。因此,如果停止所有线程,最终将在DB中部分写入数据,因为某些线程可能已经完成工作并导致事务完成。由于每个线程都是独立运行的,因此您没有机会回退所有已提交的事务以完成线程。
如果您仍致力于并行处理50MB数据,请考虑进行2次传递:
这将满足您的要求,并且如果在将任何数据写入数据库之前发生验证错误,则可以保证完全归档。其次,它确保可以将数据自动写入数据库。要执行所需的操作,您需要在java.util.concurrent
包中使用类似CyclicBarrier或其他类型的同步器。
还有许多框架可以使这些工作变得更轻松,并处理错误情况和作业的可重用性。 Spring Batch是一种这样的工具,还有更多工具。