在春季之间在线程之间共享服务

时间:2019-01-28 17:24:55

标签: java spring multithreading hibernate concurrency

让我们假设我在ftp服务器上存储了大约100 000个文件(总共大约100 GB)。在我的数据库中,我有10万行FILE_LOCATION,其中包含FTP服务器上每个文件的确切位置。现在我想通过REST从FTP服务器发送我的所有文件到其他服务器。我创建了一个执行以下操作的工具:

@Autowired
private FtpService ftpService;

@Autowired
private RestService restService;

@Autowired
private FileListProvider fileListProvider;

@Autowired
private LogService logService;

public void migrateFiles(){
    List<Object> fileList = fileListProvider.getFileList(); // fetch list of ftp file locations

    try {
        ftpService.openconnection();
        fileList.forEach(fileRecord -> {
            File file = ftpService.fetchFile(fileRecord); //get single file
            restService.sendFile(file); // send file to remote server
            logService.logFileSend(file); // log file sending record into db
        });
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        ftpService.closeConnection();
    }
}

这工作得很好,我看到的唯一问题是性能:处理单个文件(下载,上传,创建日志)大约需要6秒钟,因为我的传输文件可以处理更多内容,并且文件不共享任何内容在彼此之间,我想做这个多场聚会。我的想法是为每个文件上载创建ardard,并同时处理它们。但是我有一些担忧,并指出我的问题所在:

  1. 如何在各个场馆之间共享我的春豆? (我尝试实现Runnable的自定义Theard类,但无法访问spring上下文来获取bean)我找不到基于注释的配置的任何好例子
  2. 由于我的ftp连接和会话作为私有变量存储在ftpService中,因此该bean应该是在剧院之间共享的单例。还是我应该为会议创建新的连接和会话,以免彼此干扰?
  3. 第2点的相似之处在于我的logService,因为我正在使用数据库中的序列生成器创建新实体,它们在创建时不会互相干扰吗?
  4. 肯定有比从数据库中读取10万条记录更好的方法,而不是将它们加载到内存中,可分页是最好的选择还是有更好的解决方案?

目前我估计整个过程大约需要7天,我的目标是不到2天。

0 个答案:

没有答案