在java中使用多线程从本地到DBFS服务器的大量文件复制

时间:2014-09-05 12:01:38

标签: java multithreading

我需要从一些共享网络路径上传大量文件(比如100 gbs)到数据库DBFS服务器。 我使用下面的代码,它工作正常。但是我需要使用JSch和ExecutorService类线程池来使用多线程概念来加速这个过程

请参阅我的以下代码

public static void sftpConnection()throws JSchException, SftpException, IOException {


    System.out.println("Inside sftpConnection method");
    JSch jsch = new JSch();
    Session session = null;
    Channel channel = null;
    String user = "oracle";
    //  String host ="";
    String host ="";

    Integer port =;
    String password ="";
    String Folder ="";
    String outputDir ="";
    String filema =".txt";
    ChannelSftp sftpChannel = null;
    try 
    {
        session = jsch.getSession(user, host, port);
        System.out.println("Afer getting Session"+session);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword(password);
        System.out.println("Set Password");
        session.setConfig("PreferredAuthentications","publickey,keyboard-interactive,password");

        session.connect();
        System.out.println("Connection Successfull");
        channel = session.openChannel("sftp");
        channel.connect();
        System.out.println("Channel Connection Succesfull");
        sftpChannel = (ChannelSftp)channel;

        File[] files = findFile(Folder, filema);
        for(File file : files) 
        {
            putFile(file, sftpChannel, outputDir);            

        }              
        File dir = new File(""); 
        dir.mkdirs(); 
    } 
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally 
    {
        if (sftpChannel != null) {
            sftpChannel.exit();
        }
        session.disconnect();
    }
}

任何人都可以帮助我实现JSch和ExecutorService来处理从服务器到DBFS服务器的100gbs数据。 在此先感谢

2 个答案:

答案 0 :(得分:0)

使用Java8轻松:

Arrays.stream(files).parallel()
             .forEach((f) -> putFile(f, sftpChannel, outputDir));

请注意,sftpChannel必须是线程安全的才能正常工作,这可能无法提高性能。我会根据put操作创建一个频道,或使用连接池为您管理此频道。

您可以通过更改公共forkjoin池的大小来控制所使用的并行数量(作为JVM参数传递):

-Djava.util.concurrent.ForkJoinPool.common.parallelism=120

这将创建一个包含120个线程的线程池。

答案 1 :(得分:0)

多线程可以通过使用多个线程来并行化计算来帮助加速计算密集型进程。但是简单的文件复制不是计算密集型的,而是I / O密集型的。

在多个线程上运行无法帮助您。您的网络带宽是相同的,无论您尝试向其汇集数据的管道数量是多少。