我正在使用JSCH进行文件上传sftp . 在当前状态下,每个线程在需要时打开和关闭连接 .
如果可以使用与JSCH的连接池以避免由大量连接打开和关闭引起的开销?
这是从线程内部调用的函数示例
public static void file_upload(String filename) throws IOException {
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("user", "server_name", 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("super_secre_password");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
FileInputStream inputSrr = new FileInputStream(filename);
try {
sftpChannel.put(inputSrr, "/var/temp/"+filename);
} catch (SftpException e) {
e.printStackTrace();
} finally {
if (inputSrr != null) {
inputSrr.close();
}
}
sftpChannel.exit();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
}
3 回答
为此,我更喜欢commons-pool . ;)
这是Ssh连接池的实现http://www.javacodegeeks.com/2013/02/pool-of-ssh-connections-using-apache-keyedobjectpool.html
你可以使用grep4j来使用这个池https://code.google.com/p/grep4j/source/browse/trunk/src/main/java/org/grep4j/core/command/linux/SessionFactory.java?r=354
还要确保您可以从执行计算机访问服务器 . 例如,如果目标服务器不在您的手中 . 它会抛出连接超时 .
我希望与您分享我们的实施,我们使用Session Manager of jsch-extension library
首先,您需要实现负责池化对象生命周期的池对象工厂:
现在您可以使用配置的工厂创建池:
这个java文档可以帮助您正确配置池:https://commons.apache.org/proper/commons-pool/api-2.6.0/org/apache/commons/pool2/impl/BaseGenericObjectPool.html
不要忘记正确借用和将对象返回池:https://commons.apache.org/proper/commons-pool/api-2.6.0/org/apache/commons/pool2/ObjectPool.html