1. 程式人生 > >ftp連線池實現

ftp連線池實現

public class FTPClientPool implements ObjectPool<FTPClient> {
  private static Logger logger = LoggerFactory.getLogger(FTPClient.class);

  private static final int DEFAULT_POOL_SIZE = 10;

  public BlockingQueue<FTPClient> blockingQueue;

  private FTPClientFactory factory;

  public FTPClientPool(FTPClientFactory factory) throws Exception {
    this(DEFAULT_POOL_SIZE, factory);
  }

  public FTPClientPool(int poolSize, FTPClientFactory factory) throws Exception {
    this.factory = factory;
    this.blockingQueue = new ArrayBlockingQueue<FTPClient>(poolSize);
    initPool(poolSize);
  }

  /**
   * 初始化連線池
   * @param maxPoolSize
   *                  最大連線數
   * @throws Exception
   */
  private void initPool(int maxPoolSize) throws Exception {
    int count = 0;
    while(count < maxPoolSize) {
      this.addObject();
      count++;
    }
  }

  /**
   * 從連線池中獲取物件
   */
  @Override
  public FTPClient borrowObject() throws Exception {
    FTPClient client = blockingQueue.take();
    if(client == null) {
      client = factory.makeObject();
    } else if(!factory.validateObject(client)) {
      invalidateObject(client);
      client = factory.makeObject();
    }
    return client;
  }

  /**
   * 返還一個物件(連結)
   */
  @Override
  public void returnObject(FTPClient client) throws Exception {
    if ((client != null) && !blockingQueue.offer(client,2,TimeUnit.MINUTES)) {
      try {
        factory.destroyObject(client);
      } catch (Exception e) {
        throw e;
      }
    }
  }

  /**
   * 移除無效的物件(FTP客戶端)
   */
  @Override
  public void invalidateObject(FTPClient client) throws Exception {
    blockingQueue.remove(client);
  }

  /**
   * 增加一個新的連結,超時失效
   */
  @Override
  public void addObject() throws Exception {
    blockingQueue.offer(factory.makeObject(), 2, TimeUnit.MINUTES);
  }

  /**
   * 重新連線
   */
  public FTPClient reconnect() throws Exception {
    return factory.makeObject();
  }

  /**
   * 獲取空閒連結數(這裡暫不實現)
   */
  @Override
  public int getNumIdle() {
    return blockingQueue.size();
  }

  /**
   * 獲取正在被使用的連結數
   */
  @Override
  public int getNumActive() {
    return DEFAULT_POOL_SIZE - getNumIdle();
  }

  @Override
  public void clear() throws Exception {

  }

  /**
   * 關閉連線池
   */
  @Override
  public void close() {
    try {
      while(blockingQueue.iterator().hasNext()) {
        FTPClient client = blockingQueue.take();
        factory.destroyObject(client);
      }
    } catch(Exception e) {
      logger.error("close ftp client pool failed...{}", e);
    }
  }

  @Override
  public void setFactory(PoolableObjectFactory<FTPClient> factory) throws IllegalStateException, UnsupportedOperationException {

  }

  /**
   * 增加一個新的連結,超時失效
   */
  public void addObject(FTPClient ftpClient) throws Exception {
    blockingQueue.put(ftpClient);
  }
}

專案下載:


相關推薦

ftp連線實現

public class FTPClientPool implements ObjectPool<FTPClient> { private static Logger logger = LoggerFactory.getLogger(FTPClient.class); private s

使用commons-pool2實現FTP連線

一. 連線池概述 ​ 頻繁的建立和關閉連線,會極大的降低系統的效能,而連線池會在初始化的時候會建立一定數量的連線,每次訪問只需從連線池裡獲取連線,使用完畢後再放回連線池,並不是直接關閉連線,這樣可以保證程式重複使用同一個連線而不需要每次訪問都建立和關閉連線, 從而提高系統性能。 二. com

【Java】Spring和Tomcat自帶的連線實現資料庫操作

@[toc] 前言 前面我們已經用Spring和傳統的Jdbc實現資料庫操作、Spring和JdbcTemplate實現資料庫操作。但是這些都是基於直連的資料來源進行的,現在我們將介紹基於連線池的資料來源進行資料庫操作。前面幾個步驟都相同。 建立資料庫 首先建立我們的資料庫(這裡我使用的是Mysql)

jdbc連線實現

2、連線池實現   下面給出連線池類和連線池管理類的主要屬性及所要實現的基本介面: public class DBConnectionPool implements TimerListener{ private int checkedOut;//已被分配出去的連線數 private ArrayLis

servlet+jsp+mysql+資料庫連線實現註冊登陸驗證碼功能

首先專案的結構及所用到的jar包如圖: 主要用到jdbc和jstl的jar包,大家可自行去相應網站下載 一、資料庫和資料表的建立 1.建庫語句: create database test; 2.建表語句: CREATE TABLE `t_users` (  

pymysql的連線實現

在使用pymysql作為MySQL驅動時,在多執行緒模型下,如果我們沒有為每個執行緒建立一個單獨的連線的話,就會遇到下列錯誤 pymysql.err.InternalError: Packet sequence number wrong - got 0 e

自定義資料庫連線實現方式 MySQL

應用程式直接獲取資料庫連線缺點 使用者每次請求都會建立一次資料庫連線,並且資料庫建立連線會消耗相對大的資源和時間。 如果針對於個別的工具或者是大量的程式碼測試甚至系統執行,對資料庫操作次數頻繁,極大的佔用資料庫資源,有可能會發生宕機或者記憶體溢位的現象。 而在大多的專案中,常常用到阿里巴

[C++]MYSQL 資料庫操作封裝及連線實現

Database類為單例類、執行緒安全、實現了連線池,並且封裝所需要的操作。 本程式碼在Ubuntu下測試可用,使用Mysql connector c++連線資料庫,並啟用C++11特性。 基本操作如下: //資料庫配置 DbSetting set

JDBC資料庫連線實現原理(手動實現)

一、普通的資料庫連線     如下圖所示,個使用者獲取資料庫資料都要單獨建立一個jdbc連線,當用戶獲取資料完成後再將連線釋放,可見對cpu的資源消耗很大。  二

ftp連線客戶端

package com.scenetec.isv.utils.ftp.core;import com.scenetec.isv.utils.ftp.config.FtpClientProperties;import lombok.extern.slf4j.Slf4j;import org.apache.com

自定義資料庫連線實現方式 MySQL

應用程式直接獲取資料庫連線缺點 使用者每次請求都會建立一次資料庫連線,並且資料庫建立連線會消耗相對大的資源和時間。 如果針對於個別的工具或者是大量的程式碼測試甚至系統執行,對資料庫操作次數頻繁,極大的佔用資料庫資源,有可能會發生宕機或者記憶體溢位的現象。 而在大多的專案中

PHP連線實現的一種想法

雖然現在名義上是PHP開發,不過做這資料分析的事,平時工作大部分用的是JAVA。C語言出身,學的語言比較多,JAVA還算熟悉,不過之前一直都沒用連線池。第一次遇到連線池是在學校的時候女朋友用連線池出現問題了,找我,我看了下覺得沒必要,直接就刪了。那時候用的是第三方擴充套件,

spring中使用ftp連線(ftpClientPool)

如題,我們在一些專案中可能會涉及到ftp上傳、下載客戶資料、附件。但是若每次上傳或下載時都去建立一次ftp連線,上傳(  下載)一個檔案再關閉,則太耗費連線資源,這時候可以考慮使用連線池(就如同我們需要jdbc資料庫連線池的道理一樣)筆者參考了網上的一些示例、技術文章,以及現

連線實現連線Mysql資料庫

之前操作資料庫都是直接使用命令操作(因為做的都是小東西,併發量不會很大),但是如果做實際應用的東西就必須考慮使用連線池實現對資料庫的操作,因為資料庫的連線和釋放都會耗費很大的資源,連線池的原理就是連線

資料庫連線原理詳解與自定義連線實現

實現原理資料庫連線池在初始化時將建立一定數量的資料庫連線放到連線池中,這些資料庫連線的數量是由最小資料庫連線數制約。無論這些資料庫連線是否被使用,連線池都將一直保證至少擁有這麼多的連線數量。連線池的最大資料庫連線數量限定了這個連線池能佔有的最大連線數,當應用程式向連線池請求的連

fastdfs分散式檔案系統之TrackerServer連線實現

非常感謝  http://blog.csdn.net/Mr_Smile2014/article/details/52441824 公司使用fastdfs檔案系統來儲存檔案和圖片,為了避免每個系統都直接通過客戶端直接訪問fastdfs檔案系統,所以我們做了一個

java資料庫連線實現原理

原文:http://blog.csdn.net/frightingforambition/article/details/25464129  一、為什麼在連線資料庫時要使用連線池  資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得

httpclient工具類,使用連線實現,原理同資料庫連線

使用httpclient4.5實現。 注意事項: 1.user-agent最好不要亂寫,百度一些放到檔案,每次請求隨機讀取最好。 2.最好設定請求停頓時間,防止訪問過快被封。 3.返回結果亂碼請設定返回的資料的編碼格式,預設utf8. 程式碼: package com.c

httpcomponents httpclient連線實現與測試

在windows環境下,使用Process Explorer檢視連線數和連線狀態。 package http.connection

Hive使用druid做連線程式碼實現

配置文件 hive_jdbc_url=jdbc:hive2://192.168.0.22:10000/default hive.dbname=xxxxx hive_jdbc_username=root hive_jdbc_password=123456 #配置初始化大小、最小、最大 hiv