- 浏览: 1595526 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
jsrgzhangzhiyong:
关于null值的转换还是感觉不太友好,就像 mapstruct ...
我也造了个轮子:BeanMapping(属性拷贝) -
he037:
a417930422 写道引用使用EPHEMERAL会引出一个 ...
基于zookeeper的分布式lock实现 -
seancheer:
qianshangding 写道首先节点启动后,尝试读取本地的 ...
zookeeper学习记录三(session,watcher,persit机制) -
雪夜归人:
您好,我想咨询一下,开源的canal都能支持mysql的哪些版 ...
Canal BinlogChange(mysql5.6) -
zhoudengyun:
copy 一份做记录,后续学习,请知悉
阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费
背景
前段时间研究了下dbcp的一些源码,发现dbcp对common pools依赖比较严重,基本就是基于pool的扩展接口实现的。所以也就顺便看了下pools的源码。
总体结构
common pools的代码总体结构来说是比较简单的。
先上一个类图:
核心接口类:
- ObjectPool 对象池
- ObjectPoolFactory 池的维护工厂
- PoolableObjectFactory 可池化对象的维护工厂
- KeyedObjectPool 基于kety的对象池
- KeyedObjectPoolFactory
- KeyedPoolableObjectFactory
说明: ObjectPool和KeyedObjectPool基本接口都是一致的,唯一不同的就是KeyedObjectPool是基于key做为键值,其对应的存储结构就是 Map<Object , List<Object>>, 每次根据key定位List<objct>的value后,再进行池化管理。
几个pools的实现类:
1. GenericObjectPool: 通用的对象池处理类,维护池的大小,空闲链接等等。 针对对象的makeObject,destoryObject等都是委托给PoolableObjectFactory进行处理。
基本参数和dbcp的配置参数一样,可以参考: http://agapple.iteye.com/admin/blogs/772507
关注几个特别的参数:
- _lifo : 采用的列表管理模式,采用先进先出or后进先出。 默认是先进先出,底层具体的池对象储存是通过CursorableLinkedList。
- _softMinEvictableIdleTimeMillis : 软性idle空闲管理。默认是-1。 相比于_minEvictableIdleTimeMillis,系统默认优先处理_minEvictableIdleTimeMillis空闲管理机制,除此主要的区别就是处理空闲链接时,soft会考虑当前的池大小是否满足 > minIdle数。
- _timeBetweenEvictionRunsMillis : Evict管理线程的运行时间,默认-1。也就是说默认不运行,注意如果要使用idle空闲管理必须设置该值,否则没效果。
2. StackObjectPool : 基于stack堆栈概念的对象池,对象池的borrow或者return都是符合stack的先进先出弹栈的管理,相比于GenericObjectPool,它只有maxIdle(最大空闲数), maxTotal(最大资源数)管理,暂时还未想到特定的应用场景,因为觉得GenericObjectPool的功能基本可以覆盖StackObjectPool,只要适当的调整参数。
3. SoftReferenceObjectPool : 看名字就应该猜到是基于SoftReference进行对象持有的pool,在内存不足时可以主动的释放pool object对象, 通过ReferenceQueue获取object对象需要被清除的时间点。至于SoftReference可以看下理解 Java 的 GC 与 幽灵引用
4. GenericKeyedObjectPool: 区别于GenericObjectPool,主要是该pool池,针对每个资源都有自己特定的域,就是一个对应的key。每个key下可以有一组object。 maxTotal是针对所有的key下的object之和,而非单个。
如何实现自定义的pool
首先以dbcp为例,介绍其相关扩展点。
说明:
1. dbcp整个连接池的管理是使用GenericObjectPool
2. dbcp这里通过扩展实现自定义的PoolableObjectFactory , 用于定义如何创建/销毁/校验一个datasource等。
3. 使用的statement cache利用的是GenericKeyedObjectPool,因为statement cache是基于key进行statement管理的,所以比较适合。但目前在使用statement cache会出现一些异常情况,慎用。
4. PoolingConnection实现了statement cache对应池对象的创建/销毁。 同时在datasource的执行close,同时需要清理整个statement cache pool的close动作,避免出现资源泄漏。
实际demo:
实现一个memcache client的连接池代码
1. 实现一个PoolableObjectFactory接口,提供创建/销毁/校验的方法
public class MemcachedPoolableSocketFactory implements PoolableObjectFactory { ....... public MemcachedPoolableSocketFactory(String host, int port, int connectedTimeout){ this.host = host; this.port = port; this.connectedTimeout = connectedTimeout; } @Override public Object makeObject() throws Exception { return new SockIO(host, port, connectedTimeout); } @Override public void destroyObject(Object obj) throws Exception { if (obj instanceof SockIO) { ((SockIO) obj).close(); } } @Override public boolean validateObject(Object obj) { if (obj instanceof SockIO) { SockIO sock = (SockIO) obj; try { sock.getOut().write("version \r\n".getBytes()); sock.getOut().flush(); } catch (IOException e) { e.printStackTrace(); } } return true; } ...... }
2. 创建SocketPool类,用于管理pool
public class MemcachedSocketPool { private GenericObjectPool sockPool = null; private int maxActive = 50; private int minIdle = 1; private int maxIdle = 50; private int maxWait = 1000; public MemcachedSocketPool(String host, int port){ sockPool = new GenericObjectPool(); sockPool.setMaxActive(maxActive); sockPool.setMaxIdle(maxIdle); sockPool.setMinIdle(minIdle); sockPool.setMaxWait(maxWait); sockPool.setTestOnBorrow(false); sockPool.setTestOnReturn(false); sockPool.setTimeBetweenEvictionRunsMillis(10 * 1000); sockPool.setNumTestsPerEvictionRun(maxActive + maxIdle); sockPool.setMinEvictableIdleTimeMillis(30 * 60 * 1000); sockPool.setTestWhileIdle(true); sockPool.setFactory(new MemcachedPoolableSocketFactory(host, port, 1000)); } public SockIO createSocket() { assert sockPool != null; try { return (SockIO) sockPool.borrowObject(); } catch (Exception e) { } return null; } }
3. 客户端端使用
MemcachedSocketPool pool = new MemcachedSocketPool("10.20.156.37", 6000); SockIO sock = pool.createSocket(); sock.write(cmd.getBytes()); sock.flush();
使用common-pools后,实现一个自己的连接池也是相对比较单了
评论
jude,一款java写的,有对应的免费版. 一般linux下用的挺多的
发表评论
-
yugong QuickStart
2016-03-05 01:52 0几点说明 a. 数据迁移的方案可参见设计文档,oracl ... -
阿里巴巴开源项目: 阿里巴巴去Oracle数据迁移同步工具
2016-03-05 18:29 6509背景 08年左右,阿里巴巴开始尝试MySQL的相关 ... -
愚公performance
2016-03-02 17:29 0性能测试 全量测试 场景1 (单主键, ... -
yugong AdminGuide
2016-03-02 16:40 0环境要求 操作系统 数据库 迁移方案 部署 ... -
Tddl_hint
2014-01-27 13:52 0背景 工作原理 Hint格式 direct模 ... -
tddl5分库规则
2014-01-26 14:41 0背景 工作原理 构建语法树 元数据 基于 ... -
tddl5优化器
2014-01-22 15:12 0背景 工作原理 构建语法树 元数据 抽象语 ... -
Canal BinlogChange(mariadb5/10)
2014-01-20 17:25 4587背景 先前开源了一个 ... -
asynload quickstart
2013-10-08 22:49 0几点说明: 1. asyncload是做为一个j ... -
网友文档贡献
2013-09-18 15:50 01. Otter源代码解析系列 链接:http://e ... -
Manager配置介绍
2013-09-16 13:00 0通道配置说明 多种同步方式配置 a. 单向同步 ... -
canal&otter FAQ
2013-09-05 17:30 0常见问题 1. canal和 ... -
阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
2013-08-22 16:48 40433项目背景 阿里巴巴B2B公司,因为业务的特性 ... -
Otter AdminGuide
2013-08-19 11:06 0几点说明 otter系统自带了manager,所以简化了一 ... -
Otter高可用性
2013-08-17 23:41 0基本需求 网络不可靠,异地机房尤为明显. man ... -
Otter数据一致性
2013-08-17 23:39 0技术选型分析 需要处理一致性的业务场景: 多地修改 ( ... -
Otter扩展性
2013-08-17 22:20 0扩展性定义 按照实现不同,可分为两类: 数据处理自定 ... -
Otter双向回环控制
2013-08-17 21:37 0基本需求 支持mysql/oracle的异构数据库的双 ... -
Otter调度模型
2013-08-17 20:13 0背景 在介绍调度模型之前,首先了解一下otter系统要解 ... -
Otter Manager介绍
2013-08-16 11:16 0背景 otter4.0发布至 ...
相关推荐
这是dhcpd-pools ISC dhcp共享网络和池范围使用情况的分析。 该命令的目的是计算ISC dhcpd控制的每个IP范围和共享网络池的使用率。 该命令的用户最有可能是具有较大IP空间的ISP和其他组织。 程序用C编写。设计目标是...
commons-pools-2.2.6.1.jar
relint-ci-pools更新发布池该池用于更新发布管道,因此可以一次运行多个作业。 当前有4个,并且锁定文件本身包含元数据,该元数据将在cf-deployment-concourse-tasks中使用,以动态地针对正确的环境。 证书本身是...
pyspark充当kafka消费者时报错 :pyspark.sql.utils.IllegalArgumentException:One of the following options must be specified for Kafka source: subscribe, subscribepattern, assign. See the docs for more ...
cd vesper-pools npm install npm run truffle compile 在环境中设置NODE_URL export NODE_URL= 测试 注意:这些测试将按步骤3中的要求派生主网。建议不要一次运行所有测试,而要指定一个文件。 运行单个文件 ...
OSM游泳池OpenStreet... node index.js 这会将数据下载到名为pools.geojson的文件中,然后将数据压缩到TopoJSON中,以分发给应用程序。 应用程序使用的是TopoJSON,GeoJSON可以作为工件使用。 编译应用npm run build
总之,`balancer-pools-analytics` 脚本提供了一种方便的方式来跟踪和分析 Balancer Pools 的 APY,帮助用户更好地理解他们的投资表现。通过深入理解和使用这个工具,投资者可以做出更明智的决策,最大化他们在 DeFi...
用法$ ./pools 站点博客开始$ ./pools 站点博客重新加载$ ./pools 站点博客重启$ ./pools site-blog force-quit $ ./pools 站点博客站
7. **内存管理**:ACE提供了一些高级的内存管理工具,如Smart Pointers和Memory Pools,以优化内存分配和释放,减少内存泄漏。 8. **日志和调试**:ACE包含了一个强大的日志系统,以及调试工具,如ACE_Tracer,方便...
- **计算VP-Pool LUN容量**:通过分析VP-Pool的空间消耗情况,帮助用户理解VP-Pool内部空间的使用情况。 - **揭示私有RAID组构造**:确保驱动器级别的冗余,符合最佳实践标准,并帮助用户理解相关的开销。 - **IOPS...
包含内容检索和解析的Web内容收集通常是分析任务(例如搜索,广告放置和相关性排名)的先兆。 作为该项目的一部分,我开发了一种分布式内容收集器,该收集器使用线程池来检索和解析内容。 该分布式收割机支持的功能...
NIM池中心矿工 GUI由Albermonte提供,Miner由SushiPool&Mat(tomkha)提供 从发布页面下载最新版本: 运作中的CPU和GPU矿工 构建设置 # install dependencies npm install # serve with hot reload at localhost...
Node.js Discord Bot 基于: 从本教程
在Apache Commons Pool2的源代码分析中,我们可以深入理解以下几个核心知识点: 1. **对象池的基本原理**:对象池的主要思想是预先创建一组对象并存储在一个池中,当需要对象时,不是直接创建新的,而是从池中获取...
派智能泳池馅饼智能池是资产管理不可知(目前仅平衡器)d ecentralisedŤraded˚Funds。 它们共享一个通用接口,从而易于集成到其他产品中。 所有智能池都可以完全升级,以便在以后阶段轻松添加功能并优化天然气使用...
Unisave池接口 该项目是通过引导的。 可用脚本 在项目目录中,可以运行: yarn start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒错误...
标题中的"jedis-3.2.0.jar + commons-pool2-2.6.2.jar"提到了两个关键的Java库:Jedis和Apache Commons Pool2。Jedis是Java编程语言中广泛使用的Redis客户端,而Apache Commons Pool2则是一个对象池实现,用于有效地...
在SAP ABAP编程中,动态内表的创建是实现灵活数据处理的重要手段,尤其是在处理大量数据或涉及多个系统表的场景下。本篇将详细解释如何动态地创建和使用内表,以及在进行动态更新时需要注意的关键点。...
可扩展服务器设计使用线程池 该项目的目的是使用线程池平衡服务器上的负载。 线程创建是一个昂贵的过程,涉及时间和资源,因此,与其为服务器收到的每条消息生成一个线程,不如使用一个线程池执行任务,这是理想的...
不过,仅凭这个类文件无法提供更多信息,需要更多相关代码或文档才能进行详细分析。 总结起来,要解决WebLogic Server的连接数限制问题,关键在于正确地调整线程池配置,并根据服务器负载进行监控和优化。了解...