调用示例:
        var tran = ThriftPool.Instance().BorrowInstance();TProtocol protocol = new TBinaryProtocol(tran);var client = new xxxx(protocol);   //xxxx为生成的thrift代理类的Client对象var ret = client.TestMethod(parameters);     //TestMethod为业务方法名称
            ThriftPool.Instance().ReturnInstance(tran);return ret;

配置信息类:
    internal class ThriftConfig{#region 单例入口private static ThriftConfig instance = null;private static object objLock = new object();public static ThriftConfig Instance(){if (instance == null){lock (objLock){if (instance == null){instance = new ThriftConfig();}}}return instance;}#endregion#region 私有构造函数private ThriftConfig(){Host = ConfigHelper.GetAppSettingValue("ESHost");Port = ConfigHelper.GetAppSettingInt32Value("ESPort");Encode = Encoding.UTF8;Timeout = 3000;MaxActive = ConfigHelper.GetAppSettingInt32Value("ESMaxActiveConnectionCount");MaxIdle = ConfigHelper.GetAppSettingInt32Value("ESMaxIdleConnectionCount");MinIdle = ConfigHelper.GetAppSettingInt32Value("ESMinIdleConnectionCount");MaxWait = 5;}#endregion#region 配置属性定义public string Host { get; set; }public int Port { get; set; }public Encoding Encode { get; set; }public bool Zipped { get; set; }public int Timeout { get; set; }public int MaxActive { get; set; }public int MaxIdle { get; set; }public int MinIdle { get; set; }public int MaxWait { get; set; }#endregion}

  

连接池处理类:
    internal class ThriftPool{#region 属性private ThriftConfig config;/// 对象缓存池private static Stack<TTransport> objectPool { get; set; }/// 同步对象private static AutoResetEvent resetEvent;/// 空闲对象数private static volatile int idleCount = 0;private static volatile int activeCount = 0;/// 同步对象锁private static object locker = new object();#endregion#region 单例入口private static long testcount = 0;private static ThriftPool instance = null;private static object objLock = new object();public static ThriftPool Instance(){if (instance == null){lock (objLock){if (instance == null){instance = new ThriftPool();}}}return instance;}#endregion#region 构造函数private ThriftPool(){config = ThriftConfig.Instance();CreateResetEvent();CreateThriftPool();}#endregion#region 公有操作方法/// 从对象池取出一个对象public TTransport BorrowInstance(){lock (locker){//Zkx.Infrastruction.Logger.Log.DebugFormat("借前对象池个数:{0},空闲个数:{1}", objectPool.Count(), idleCount);TTransport transport;//对象池无空闲对象if (idleCount == 0){//对象池已已创建对象数达上限if (activeCount >= config.MaxActive){//Console.WriteLine("waiting..." + activeCount);resetEvent.WaitOne();}else{PushObject(CreateInstance());}}transport = objectPool.Pop();//Console.WriteLine("Pop 对象..." + transport.IsOpen);//空闲对象数小于最小空闲数,添加一个对象到对象池(已创建数不能超标)if (--idleCount < config.MinIdle && activeCount < config.MaxActive){PushObject(CreateInstance());}ValidateInstance(transport);//Console.WriteLine("借出......对象池个数:{0},空闲个数:{1}," + testcount, objectPool.Count(), idleCount);return transport;}}/// 归还一个对象/// <param name="instance"></param>public void ReturnInstance(TTransport instance){lock (locker){// Console.WriteLine("Push 对象..." + instance.IsOpen);//空闲对象数达到上限,不再返回线程池,直接销毁if (idleCount == config.MaxIdle){DestoryInstance(instance);}else{ValidateInstance(instance);PushObject(instance);//发通知信号,有对象归还到对象池resetEvent.Set();//Console.WriteLine("归还...");}}}#endregion#region 私有方法/// 创建线程同步对象private void CreateResetEvent(){lock (locker){if (resetEvent == null){resetEvent = new AutoResetEvent(false);}}}/// 创建对象池private void CreateThriftPool(){lock (locker){if (objectPool == null){objectPool = new Stack<TTransport>();}}}/// 添加对象到对象池private void PushObject(TTransport transport){objectPool.Push(transport);idleCount++;}/// 创建一个对象private TTransport CreateInstance(){activeCount++;var objsocket = new TSocket(config.Host, config.Port);objsocket.Timeout = 5000;TTransport transport = objsocket;transport.Open();//Console.WriteLine("创建对象..." + activeCount);return transport;}/// 校验对象private void ValidateInstance(TTransport instance){if (!instance.IsOpen){//Console.WriteLine("校验_重新打开...");instance.Open();}}/// 销毁对象private void DestoryInstance(TTransport instance){if (instance.IsOpen){instance.Close();}//instance.Flush();instance.Dispose();activeCount--;//Console.WriteLine("销毁...");}#endregion}

  

转载于:https://www.cnblogs.com/lijunhao/p/5969840.html

thrift - C#(CSharp)客户端连接池(ConnectionPool)相关推荐

  1. gRPC学习记录(六)--客户端连接池

    对于客户端来说建立一个channel是昂贵的,因为创建channel需要连接,但是建立一个stub是很简单的,就像创建一个普通对象,因此Channel就需要复用,也就是说需要实现一个连接池应用.本文使 ...

  2. java thrift连接池_由浅入深了解Thrift之客户端连接池化

    一.问题描述 在上一篇<由浅入深了解Thrift之服务模型和序列化机制>文章中,我们已经了解了thrift的基本架构和网络服务模型的优缺点.如今的互联网圈中,RPC服务化的思想如火如荼.我 ...

  3. socket 客户端连接池实现

    本文参考:http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece76310508a24420597634b86914323c3933fcf331d5c017b ...

  4. redis客户端连接数量_redis设置并发连接数 如何合理设置连接池的大小 - Redis - 服务器之家...

    redis设置并发连接数 如何合理设置连接池的大小 发布时间:2017-04-28 来源:服务器之家 先看几个问题,再看具体内容: 1) 为什么要合理设置连接池的大小 2) 服务器端的连接配置.最大允 ...

  5. mysql linux 客户端_MySQL—Linux查看客户端连接信息(连接数、进程等)

    介绍 在开发或者运维过程中,我们连接数据库的时候突然会遇到"Too many Connections"这种报错信息:这时我们就需要排除一下是哪些程序客户端连接较多而没有释放. 查看 ...

  6. MySQL—Linux查看客户端连接信息(连接数、进程等)及SpringBoot配置数据库模板

    关注微信公众号:CodingTechWork,一起学习进步. 介绍   在开发或者运维过程中,我们连接数据库的时候突然会遇到"Too many Connections"这种报错信息 ...

  7. 0039-如何使用Python Impyla客户端连接Hive和Impala

    温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看. 1.文档编写目的 继上一章讲述如何在CDH集群安装Anaconda&搭建Python私有源后,本章节主要讲述如何使用Pyton ...

  8. [20171106]配置客户端连接注意.txt

    [20171106]配置客户端连接注意.txt --//在配置客户端连接时一般建议使用Net Manager工具,windows下调用执行Net Manager. --//linux下执行 netmg ...

  9. 设置Redis客户端连接的超时时间

    为了让Redis主动清理长时间空闲的客户端连接,回收资源,您可以设置timeout参数来限制客户端连接的空闲时间. 不设置超时时间会导致连接长时间占用,可能报错:could notget a reso ...

最新文章

  1. BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)
  2. 面试心得与总结—BAT、网易、蘑菇街
  3. 怎样使一排文字中间有间隔_超级间隔条在中空玻璃中的应用
  4. vue网址路由的实时检测
  5. SAP CRM系统订单模型的设计与实现
  6. 《视图更新与关系数据库理论》——2.1 关系和关系变量
  7. ios实践之tableView顶部“弹簧”图片
  8. 大一计算机实验报告7,计算机一级实验报告7.doc
  9. 用友元函数重载乘法,用成员函数重载除法
  10. C语言——选择法排序_数组
  11. idea中算子正确,算子下面有红波浪线,原因分析
  12. 如何搭建MySQL数据库,常用的数据库命令
  13. Guava的Optional的操作
  14. java jmf for mac 安装_Mac版-Jdk安装与环境配置
  15. linux 串口monitor,串口监视工具CommMonitor如何使用-CommMonitor的使用方法 - 河东软件园...
  16. c盘python27文件夹可以删除嘛_c盘哪些目录可以删除
  17. mysql数据库安装错误报错Falled不成功,感叹号
  18. 在html中写年月,Javascript+html:select年月日(出生日期)的写法
  19. Mac 更新系统后无法使用git
  20. 【已解决】程序异常终止:Process finished with exit code -1073741819 (0xC0000005)

热门文章

  1. 整体思考自动化测试发展和价值回报
  2. windows server 2008 R2 初试Hyper-V(一)
  3. Web3.js 0.20.x API 中文版翻译
  4. 《Python从小白到大牛》第6章 数据类型
  5. 【笔记】mysql入门语句8条
  6. MySQL Packet for query is too large
  7. LVS学习笔记及总结(思维导图版)
  8. PHP命名规范【转】
  9. Linux必学的系统管理命令-1
  10. 使用粘性布局实现tab滑动后置顶