- 浏览: 432386 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (164)
- Lucence (1)
- Hibernate (16)
- java综合技术点 (31)
- struts (4)
- dwr (2)
- IT生活 (21)
- spring (12)
- tomcat (1)
- 数据库 (11)
- tags (0)
- 线程安全 (11)
- 设计模式 (1)
- 缓存 (4)
- WebService (5)
- Apache软件 (7)
- java定时器 (1)
- plugin开发用插件 (3)
- Web前端 (5)
- js (3)
- Android (2)
- 摘抄 (0)
- jdbc (1)
- FTP (1)
- jetty (1)
- 图表 (1)
- Exception (1)
- 问题点整理 (1)
- 备忘录 (2)
- 分布式 (0)
- hadoop (0)
- JVM (5)
- GC (1)
- 消息中间件 (0)
最新评论
-
honganlei:
个人推荐一个,虽然是第三方的,但是提供的都是官方下载地址htt ...
常用jar包下载地址 -
chengt:
java jar包下载我一般用以下两个网站都可以http:// ...
常用jar包下载地址 -
songshuaiyang:
angryid 写道国内的网站,速度还可以jar包下载网站打不 ...
常用jar包下载地址 -
angryid:
国内的网站,速度还可以jar包下载网站
常用jar包下载地址 -
angryid:
我必须要评论一下,我发现一个jar包下载网站,javaeye的 ...
常用jar包下载地址
1 对象池技术的原理:
对象池技术在服务器开发上应用广泛。在各种对象池的实现中,尤其以数据库的连接池最为明显,可以说是每个服务器必须实现的部分。本文是个人学习对象池的一个记录,以Apache的commons-pool实现为研究对象。在第二部分中,本人将继续研究Apache的common-dbcp,这是对象池技术在JDBC上的一个应用范例。
ObjectPool维护一个列表,其中存放所有已经生成的对象。同时导出几个方法,如 borrowObject,returnObject,addObject等等。当用户调用borrowObject时,ObjectPool查看当前列表中的空闲对象的数目,如果有空闲的对象,则初始化该对象后返回给用户,否则创建一个对象,返回给用户使用。同理,当用户调用returnObject 时,ObjectPool查看当前队列中的空闲对象数目,如果数目小于DEFAULT_MAX_SLEEPING,则将改对象的状态清空,然后放到队列中,作为备用对象;否则直接销毁该对象。
对象池中还涉及到一些高级的技术, 比如过期销毁, 被破坏时销毁, 对象数超过池大小销毁, 对象池中没有可用空闲对象时等待等等.
池对象:就是要放到池容器中的对象, 理论上可以是任何对象.
对象池工厂(ObjectPoolFactory接口):用来创建对象池的工厂, 这个没什么好说的.
池对象工厂(PoolableObjectFactory 接口):用来创建池对象, 将不用的池对象进行钝化(passivateObject), 对要使用的池对象进行激活(activeObject), 对池对象进行验证(validateObject), 对有问题的池对象进行销毁(destroyObject)等工作
这种备用的观念正是对象池的理论基础,可以很大程度上减少对象生成和销毁的次数。对于那些初始化过程很慢的对象来说,减少对象构造和销毁的次数就等于大幅度提高了整体效率。特别是对于数据库连接这样的对象,由于进行JNDI搜索的效率极为低下,应用对象池技术是理所当然的。
需要注意的是,对象池技术并不是对任何对象都适用。因为对象池本身的操作要耗费一些资源,对于一些小对象来说,使用对象池可能取得相反的效果。IBM DeveloperWorks上有一篇论文,指出简单对象如Point,Size等,使用对象池技术并不能带来性能的改善;而复杂对象如 JPanel,JFrame等,使用对象池后能带来稍微的性能优势;最最适合对象池技术的是一些耗时操作,如JDBC连接,线程等。
2 研究 Apache common pool
对象池结构:
五种对象池可分为两类, 一类是无key的(有key的类图相似):
下面是一些时序图:
apache的连接池工具库common-dbcp是common-pool在数据库访问方面的一个具体应用.当对common-pool熟悉之后, 对common-dbcp就很好理解了. 它通过对已有的Connection, Statment对象包装成池对象PoolableConnection, PoolablePreparedStatement. 然后在这些池化的对象中, 持有一个对对象池的引用, 在关闭的时候, 不进行真正的关闭处理, 而是通过调用:
1. _pool.returnObject(this);
或:
1. _pool.returnObject(_key,this);
这样一句, 将连接对象放回连接池中.
而对应的对象池前者采用的是ObjectPool, 后者是KeyedObjectPool, 因为一个数据库只对应一个连接, 而执行操作的Statement却根据Sql的不同会分很多种. 因此需要根据sql语句的不同多次进行缓存
在对连接池的管理上, common-dbcp主要采用两种对象:
一个是PoolingDriver, 另一个是PoolingDataSource, 二者的区别是PoolingDriver是一个更底层的操作类, 它持有一个连接池映射列表, 一般针对在一个jvm中要连接多个数据库, 而后者相对简单一些. 内部只能持有一个连接池, 即一个数据源对应一个连接池.
下面是common-dbcp的结构关系:
下面是参考了common-dbcp的例子之后写的一个从连接池中获取连接的工具类
1. /**
2. * 创建连接
3. *
4. * @since 2009-1-22 下午02:58:35
5. */
6. public class ConnectionUtils {
7. // 一些common-dbcp内部定义的protocol
8. private static final String POOL_DRIVER_KEY = "jdbc:apache:commons:dbcp:";
9. private static final String POLLING_DRIVER = "org.apache.commons.dbcp.PoolingDriver";
10.
11. /**
12. * 取得池化驱动器
13. *
14. * @return
15. * @throws ClassNotFoundException
16. * @throws SQLException
17. */
18. private static PoolingDriver getPoolDriver() throws ClassNotFoundException,
19. SQLException {
20. Class.forName(POLLING_DRIVER);
21. return (PoolingDriver) DriverManager.getDriver(POOL_DRIVER_KEY);
22. }
23.
24. /**
25. * 销毁所有连接
26. *
27. * @throws Exception
28. */
29. public static void destory() throws Exception {
30. PoolingDriver driver = getPoolDriver();
31. String[] names = driver.getPoolNames();
32. for (String name : names) {
33. driver.getConnectionPool(name).close();
34. }
35. }
36.
37. /**
38. * 从连接池中获取数据库连接
39. */
40. public static Connection getConnection(TableMetaData table)
41. throws Exception {
42. String key = table.getConnectionKey();
43.
44. PoolingDriver driver = getPoolDriver();
45.
46. ObjectPool pool = null;
47. // 这里找不到连接池会抛异常, 需要catch一下
48. try {
49. pool = driver.getConnectionPool(key);
50. } catch (Exception e) {
51. }
52.
53. if (pool == null) {
54. // 根据数据库类型构建连接工厂
55. ConnectionFactory connectionFactory = null;
56. if (table.getDbAddr() != null
57. && TableMetaData.DB_TYPE_MYSQL == table.getDbType()) {
58. Class.forName(TableMetaData.MYSQL_DRIVER);
59. connectionFactory = new DriverManagerConnectionFactory(table
60. .getDBUrl(), null);
61. } else {
62. Class.forName(TableMetaData.ORACLE_DRIVER);
63. connectionFactory = new DriverManagerConnectionFactory(table
64. .getDBUrl(), table.getDbuser(), table.getDbpass());
65. }
66.
67. // 构造连接池
68. ObjectPool connectionPool = new GenericObjectPool(null);
69. new PoolableConnectionFactory(connectionFactory, connectionPool,
70. null, null, false, true);
71.
72. // 将连接池注册到driver中
73. driver.registerPool(key, connectionPool);
74. }
75.
76. // 从连接池中拿一个连接
77. return DriverManager.getConnection(POOL_DRIVER_KEY + key);
78. }
79.
80. }
虽然对象池技术在实际开发过程中用的不是很多, 但是理解之后对我们写程序还是有莫大的好处的, 至少我是这样的
3 用法:
dbcp([url]http://jakarta.apache.org/commons/dbcp/[/url])这个apache的开源的数据库连接池。结果发现dbcp依赖Apache common pool([url]http://jakarta.apache.org/commons/pool/[/url])
关于对象池更多具体用法:
[url]http://www.ibm.com/developerworks/cn/java/l-common-pool/index.html#4[/url]
发表评论
-
RSA算法 非对称加密算法/数字签名算法
2015-12-09 16:42 991转自 http://security.group.iteye ... -
加密解密、签名验签
2015-12-09 16:29 502转自http://lvbin0502.iteye.com/b ... -
深入理解JVM
2014-09-25 17:32 721转自 http://blog.sina.com.cn/s/b ... -
LinkedHashMap和HashMap、HashTable的比较使用
2014-07-11 09:45 861转自 http://www.cnblogs.com/hubi ... -
java日期函数处理
2013-09-29 16:53 967Calendar cal = GregorianCalenda ... -
JAVA开发者最常去的20个英文网站
2011-03-21 16:58 986转自 http://topmanopensource. ... -
日期工具类
2011-02-16 16:34 1079转自 http://www.iteye.com/topic/ ... -
log4j
2011-01-27 09:05 1007好处:便于维护与管理,如果系统崩溃或被黑客攻击,查日志就知 ... -
正则顺口溜
2011-01-22 11:21 1038http://cons-mora.iteye.com/blog ... -
Pattern和Matcher
2011-01-22 11:00 2546转载 http://liujinpan75.iteye.com ... -
java正则表达式
2011-01-22 10:35 984http://geeksun.iteye.com/blog/3 ... -
正则表达式的用法
2011-01-22 10:31 924http://cool1314521ok-qq-com.ite ... -
定时执行案例二
2011-01-12 17:13 1243http://blog.sina.com.cn/s/bl ... -
java定时器 schedule和scheduleAtFixedRate区别
2011-01-12 16:57 7517转自http://wangzjie.iteye.c ... -
java定时器案例
2011-01-12 15:52 1303转自http://tomenjoy.iteye.com/blo ... -
java定时器
2011-01-12 15:45 933转自 http://qinshanwu.iteye.com/b ... -
java对象的序列化和反序列化
2010-12-28 22:07 832转自http://www.iteye.com/topi ... -
架构师面试题参考
2010-12-11 13:30 9996一、牛人出的面试题如 ... -
Java的垃圾回收机制
2010-12-11 13:28 1243Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时 ... -
HttpSession理解
2010-12-10 13:37 47151 如果在jsp中没有显式使用 <%@page ses ...
相关推荐
### Java对象池技术的原理及其实现 #### 摘要 本文深入探讨了Java对象池技术的基本原理及其实现方式,旨在帮助读者理解如何利用对象池优化Java应用程序的性能。通过对对象池技术核心概念——缓存与共享的阐述,本文...
### Java对象池技术的原理 在Java开发领域中,对象池技术是一种常用的设计模式,用于管理可重用的对象集合,从而提高系统性能并减少资源消耗。本文将详细探讨Java对象池技术的基本原理及其具体实现方式。 #### ...
对象池技术是在游戏中管理瞬时对象的有效方法之一,特别是在需要频繁创建和销毁大量相似游戏对象(例如子弹、粒子效果、爆炸动画等)的情况下。通过预先加载一定数量的对象并在需要时激活它们,而不是不断地创建和...
对象池技术---免费
"基于OCI和对象池技术的跨平台Oracle数据源管理中间件的实现" 本文主要讨论基于OCI和对象池技术的跨平台Oracle数据源管理中间件的实现。该中间件使用C++语言实现,提供了统一的数据访问接口,支持多线程数据访问,...
对象池是一种在软件设计中常见的优化技术,主要目的是提高程序性能和减少系统资源的消耗。在Java编程中,对象池通常用于管理那些创建和销毁成本较高的对象,通过...理解并熟练应用对象池技术对于提升系统性能至关重要。
Unity对象池是一种优化游戏性能的技术,它通过预先创建并存储一系列可重用的游戏对象,避免了频繁的..."unity对象池的案例Demo"应该为我们提供了实践这些概念的实际代码和步骤,帮助我们更好地理解和应用对象池技术。
5. **代码注释**:为了帮助理解,Demo案例中的代码会有详细的注释,解释每个步骤的作用和实现方式,帮助开发者更好地理解和应用对象池技术。 通过学习这个Demo,开发者可以了解到如何在实际项目中应用对象池,如何...
### 对象池技术详解 #### 一、对象池的基本概念 在软件开发中,特别是针对高性能、高并发的应用场景,对象池技术是一种非常实用的设计模式。它主要用于避免频繁创建和销毁对象所带来的性能开销,特别是在对象创建...
Apache对象池技术是一种高效利用资源的策略,它通过预先创建并维护一组可重用对象来减少频繁创建和销毁对象带来的开销。在Java环境中,Apache Commons Pool库是实现对象池的常见工具,它提供了多种对象池实现,适用...
通过理解并应用对象池技术,开发者能够更有效地管理资源,减少内存压力,提高游戏运行效率。在"StudyDuiXiangChi"这个项目中,你可以进一步研究和实践这些概念,以创建自己的优化工具和解决方案。
游戏开发中的对象池技术是一种优化资源管理的策略,它通过预先创建并缓存一组对象,以避免频繁地创建和销毁对象带来的性能开销。在这个"游戏对象池例子(兼容智能指针、工厂类)"中,我们将探讨如何利用C++实现这种...
为了解决这一问题,程序员通常会采用对象池技术,Go语言也不例外。"Go Commons Pool"就是这样一个专门用于Golang的通用对象池库,它旨在提高程序运行效率,降低系统资源的频繁分配与回收带来的开销。 对象池的基本...
本项目是一个基于Java的对象池管理系统,旨在通过对象池技术减少频繁创建和销毁对象所带来的开销,从而提高系统性能和资源利用率。对象池技术允许在需要时从池中获取已存在的对象,而不是每次都创建新对象,使用完毕...
Pool Spawner Pro 通过对象池技术,避免了 Unity 内置的 Instantiate () 和 Destroy () 函数所带来的性能问题,因为对象池重用对象而不是持续创建和销毁新对象。 该工具包包含三种系统: 动态生成(Dynamic Spawn)...
Egret对象池技术在游戏开发中的应用是一个重要的性能优化策略,主要针对频繁创建和销毁的对象,例如在飞机游戏中常见的子弹。对象池通过预先创建一组对象并存储在池中,当需要新对象时,不再直接新建,而是从池中...
Unity3D对象池插件是游戏开发中一种高效管理资源的技术实现,主要目的是优化游戏性能,减少内存分配和...通过合理利用对象池技术,开发者可以创造出更加流畅、低延迟的游戏体验,特别是在处理大量动态对象的场景中。
对象池是一种资源管理技术,用于预先创建一组对象并存储在一个“池”中,当需要对象时,可以从池中获取,而不是每次需要时都创建新的对象。这样可以显著减少对象的创建和销毁开销,尤其是在创建对象成本高或者系统...
对象池技术就是一种常用的优化手段,特别是在ActionScript 3(AS3)这种面向对象的编程语言中。本文将深入探讨“对象池优化”,以及如何通过工厂方法改进对象管理,以提高程序效率。 对象池是一种设计模式,它预先...