客户端这边,如果每次都临时建立一个新的连接,那么连接的开销非常大。

业内常用的连接池组件是 Commons Pool2---版本 2.4.2

packageservice.pool;

importorg.apache.commons.pool2.BasePooledObjectFactory;

importorg.apache.commons.pool2.PooledObject;

importorg.apache.commons.pool2.impl.DefaultPooledObject;

importorg.apache.thrift.transport.TSocket;

publicclassMyPoolFactoryextendsBasePooledObjectFactory {

privateStringip;

privateintport;

publicMyPoolFactory(Stringstring,inti) {

ip=string;

port=i;

}

@Override

publicTSocket create()throwsException {

// 初始化一个对象

TSocketts=newTSocket(ip,port);

ts.open();

returnts;

}

@Override

publicPooledObject wrap(TSocketts) {

// 默认操作

returnnewDefaultPooledObject(ts);

}

/// 下面是5个生命周期

//makeObject默认

@Override

publicvoiddestroyObject(PooledObjectp)throwsException {

TSocketts=p.getObject();

ts.close();

}

@Override

publicbooleanvalidateObject(PooledObjectp) {

TSocketts=p.getObject();

returnts.isOpen();

通过发送紧急数据解决此问题,Thrift服务器端不要开启对应的设置,经过测试OK.

然后,后来又想到,我自己写一个MyTSocket 继承TSocket,然后一旦业务线程拿到连接池给我的一个MyTSocket(注意:此时可能socket无效)

然后业务线程使用过程中发现有异常,则设置MyTSocket的一个属性为false,连接池检测时兼顾这个属性就可以了。

最后发现这个还不能彻底解决问题,jedis采用的是业务探测:ping-pong,这个是redis自己的协议

对于其它的服务器怎么办?我们查了百度,采用的办法是:

publicbooleanvalidateObject(PooledObjectp) {

MyTSockett=p.getObject();

Sockets=t.getSocket();

booleanclosed=s.isClosed();

booleanconnected=s.isConnected();

booleanoutputShutdown=s.isOutputShutdown();

booleaninputShutdown=s.isInputShutdown();

booleanurgentFlag=false;

try{

s.sendUrgentData(0xFF); //在这里

}catch(IOExceptione) {

}

returnurgentFlag&&connected&& !closed&& !inputShutdown&& !outputShutdown&&t.isAlive();

}

}

@Override

publicvoidactivateObject(PooledObjectp)throwsException {

// 返回给调用方时,做一些额外的操作

}

/**

* When an object is returned to the pool, clear the buffer.

*/

@Override

publicvoidpassivateObject(PooledObjecttSocket) {

// 返回到pool时,做一些额外的操作

}

}

============================

具体使用时

// 设置传输通道,对于非阻塞服务,需要使用TFramedTransport,它将数据分块发送

GenericObjectPoolConfigpoolConfig=newGenericObjectPoolConfig();

poolConfig.setBlockWhenExhausted(true);

poolConfig.setMaxWaitMillis(100);

poolConfig.setLifo(false);

poolConfig.setMaxIdle(50); 最大空闲连接数

poolConfig.setMinIdle(50);// 最小空闲连接数

poolConfig.setMaxTotal(100);// 整个池的最大值,最大连接数

poolConfig.setTestOnBorrow(true);

poolConfig.setTestOnCreate(true);

poolConfig.setTestOnReturn(true);

poolConfig.setTestWhileIdle(false);

GenericObjectPoolpools=newGenericObjectPool(newMyPoolFactory("127.0.0.1", 7911),poolConfig);

// 具体使用代码

TSocketts= (TSocket)pools.borrowObject();

pools.returnObject(ts);

common pool2 mysql_连接池Commons Pool2的使用相关推荐

  1. 通过连接池无法连接mysql_连接池无法链接数据库

    这是出错提示信息:typeExceptionreportmessagedescriptionTheserverencounteredaninternalerror()thatpreventeditfr ...

  2. Java hdfs连接池_Java使用连接池管理Hdfs连接

    记录一下Java API 连接hadoop操作hdfs的实现流程(使用连接池管理). 以前做过这方面的开发,本来以为不会有什么问题,但是做的还是坑坑巴巴,内心有些懊恼,记录下这烦人的过程,警示自己切莫 ...

  3. JAVA怎么连接华为的HDFS系统_Java使用连接池管理Hdfs连接

    记录一下Java API 连接hadoop操作hdfs的实现流程(使用连接池管理). 以前做过这方面的开发,本来以为不会有什么问题,但是做的还是坑坑巴巴,内心有些懊恼,记录下这烦人的过程,警示自己切莫 ...

  4. 自己写的grpc简单连接池,基于common pool2

    17年的时候写的证券的项目,当时交易端是另外一批同事开发的,他们强烈要求用grpc,当时这个东西还不那么成熟,在网上也搜索不到比较完美的第三方的连接池搭配使用,索性就自己写了一个,因为之前thrift ...

  5. common pool2 mysql_用common-pool自定义资源池

    以前认为连接池,线程池这些东西很高端.因为出了问题之后,总是有人说这个连接池/线程线的配置不对嘛,应该..... 今天学习了下,这个池到底应该怎么设计.发现apache的common-pool早就思考 ...

  6. commons.pool2 对象池的使用

    commons.pool2 对象池的使用 ? 1 2 3 4 5 <dependency>     <groupId>org.apache.commons</groupI ...

  7. java.lang.NoClassDefFoundError: org/apache/commons/pool2/PooledObjectFactory

    用GenericObjectPool来连接postgres数据库,在pom.xml中也加入了依赖 <!-- https://mvnrepository.com/artifact/org.apac ...

  8. jndi连接池链接mysql_使用容器提供的数据库连接池--JNDI用法

    现在,数据库的连接没有用到连接池几乎很少很少,每个项目组都可能有自己的数据库连接池组件,各容器提供商也提供了各自的数据库连接池,下面介绍一下tomcat和weblogic使用JNDI的数据库连接管理. ...

  9. mysql连接池_数据库技术:数据库连接池,Commons DbUtils,批处理,元数据

    Database Connection Pool Introduction to Database Connection Pool 实际开发中"获得连接"或"释放资源&q ...

最新文章

  1. Mysql-学习笔记(==》常用函数 八)
  2. Spring的核心思想,总结得非常好!
  3. javascript foreach中获取数组下标/index
  4. Linux 创建交换(swap)分区
  5. 安卓学习 之 ContentResolver内容提供者(七)
  6. android java 调试快捷键_Android Studio 代码页跳界面 /java和XML快速切换技巧
  7. 天池 在线编程 卡牌游戏(01背包)
  8. linux Postfix + dovecot + extmail + extman + mysql
  9. 【数据结构与算法】森林版并查集V1.0的Java实现
  10. loadrunner如何监控linux,以及重点指标分析
  11. 理解 Android 消息机制
  12. 腾讯云推出首款自研服务器星星海;苹果新款Mac Pro整套配齐超30万;Fedora 31稳定版发布|极客头条...
  13. SSE3指令集系列----数据加载与算术运算指令
  14. 毛哥的快乐生活(1) 猫哥与毛哥
  15. 电脑桌面图标变成长方形咋办_为什么我的界面上的图标全部被一个长方形的图标覆盖了?...
  16. 王倩兮金碧山水作品《绿水青山就是金山银山》
  17. GFS 区域风场解析问题
  18. 纯原生javascript下拉框表单美化实例教程
  19. android+读书笔记
  20. 《那些年啊,那些事——一个程序员的奋斗史》十三

热门文章

  1. php获取全部post_php post获取所有提交
  2. html javascript 音频、视频、 mp3 、mp4 的播放、暂停、重新播放、获取音频时长、视频自动全屏播放
  3. 【文本分类】基于类信息的TF-IDF权重分析与改进
  4. 语义分割--DeconvNet--Learning Deconvolution Network for Semantic Segmentation
  5. c51语言的标准库函的头文件,C51编程中头文件的使用
  6. 用虚拟机学linux,虚拟机上学习Linux运维?学linux有什么用
  7. mfc 访问局域网mysql_数据库操作:MFC连接与MYSQL
  8. 尖峰 mysql 源码方向_MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图...
  9. execel公式 java工具,MyExcel(Excel Java工具包) v3.0.0下载
  10. pycharm使用Djiago创建第一个web项目