在项目中用到FastDFS,用来存图片,刚开始单线程进行测试,所以没什么问题,但是在多个客户端进行上传后,发现经常性的会报一下错误:
FastDFS多线程经常性会遇到这样的问题,这是因为FastDFS本身提供的是简单的客户端上传代码,源码中没有包含连接池,线程测试的代码如下:
(1)多线程下载测试代码
import edu.fzu.cmp.thirdpackage.fastdfs.FastdfsClient;
public class FastdfsClientTest {
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
new Thread(new Runnable() {
public void run() {
for (int j = 0; j < 6; j++) {
try {
String group_name = "group2";
String remote_filename = "/M00/00/04/O03saVlz_fmAWxyEAAMbzl2LTmk854.tif";
FastdfsClient.download1(group_name, remote_filename,
fileName + Thread.currentThread().getId() + j + ".tif");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}
}
(2)多线程上传代码
public static void uploadFile() { String[] strings = null; StorageClient storageClient = null; try { String configFilePath = "fdfs_client.conf"; ClientGlobal.init(configFilePath); TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getConnection(); StorageServer storageServer = null; storageClient = new StorageClient(trackerServer, storageServer); } catch (Exception e) { e.printStackTrace(); } try { strings = storageClient.upload_file("D:\\图片\\1.tif", "tif", null); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } System.out.println(strings[0] + "/" + strings[1]); } public static void main(String[] args) { // 多线程插入测试 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10); for (int i = 0; i < 10; i++) { final int index = i; fixedThreadPool.execute(new Runnable() { public void run() { MutiInsert.uploadFile(); } }); } }
这主要是因为FastDFS只提供了简单的上传方法,并不支持多个客户端,如果需要用到多线程上传需要自己实现连接池,在github上下载了FastDFS的连接池,但是一般的连接池只是提供上传和删除的方法,并不会提供查询的方法,经过google发现FastDFS的图片下载可以通过Nginx方式进行,而不仅仅通过Java客户端的,这样并发量就转到nginx中。
通过以上的方式就能实现多线程上传、删除和查询。