- 浏览: 425455 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 937转自 http://security.group.iteye ... -
加密解密、签名验签
2015-12-09 16:29 460转自http://lvbin0502.iteye.com/b ... -
深入理解JVM
2014-09-25 17:32 685转自 http://blog.sina.com.cn/s/b ... -
LinkedHashMap和HashMap、HashTable的比较使用
2014-07-11 09:45 822转自 http://www.cnblogs.com/hubi ... -
java日期函数处理
2013-09-29 16:53 936Calendar cal = GregorianCalenda ... -
JAVA开发者最常去的20个英文网站
2011-03-21 16:58 958转自 http://topmanopensource. ... -
日期工具类
2011-02-16 16:34 1051转自 http://www.iteye.com/topic/ ... -
log4j
2011-01-27 09:05 974好处:便于维护与管理,如果系统崩溃或被黑客攻击,查日志就知 ... -
正则顺口溜
2011-01-22 11:21 997http://cons-mora.iteye.com/blog ... -
Pattern和Matcher
2011-01-22 11:00 2487转载 http://liujinpan75.iteye.com ... -
java正则表达式
2011-01-22 10:35 940http://geeksun.iteye.com/blog/3 ... -
正则表达式的用法
2011-01-22 10:31 880http://cool1314521ok-qq-com.ite ... -
定时执行案例二
2011-01-12 17:13 1204http://blog.sina.com.cn/s/bl ... -
java定时器 schedule和scheduleAtFixedRate区别
2011-01-12 16:57 7474转自http://wangzjie.iteye.c ... -
java定时器案例
2011-01-12 15:52 1265转自http://tomenjoy.iteye.com/blo ... -
java定时器
2011-01-12 15:45 902转自 http://qinshanwu.iteye.com/b ... -
java对象的序列化和反序列化
2010-12-28 22:07 801转自http://www.iteye.com/topi ... -
架构师面试题参考
2010-12-11 13:30 9963一、牛人出的面试题如 ... -
Java的垃圾回收机制
2010-12-11 13:28 1171Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时 ... -
HttpSession理解
2010-12-10 13:37 46751 如果在jsp中没有显式使用 <%@page ses ...
相关推荐
Java对象池技术的原理及其实现
对象池技术---免费
是关于Java对象池技术的原理及其实现的
基于OCI和对象池技术的跨平台Oracle数据源管理中间件的实现.pdf
最简单高效的JAVA对象池、线程池、以及使用对象池技术实现的数据库连接池 已在生产运行5年以上的代码 若有任何问题请与我联系
对象池 射击游戏 子弹的反复生成 Demo案例+注释详解帮你更好的理解对象池技术
自己做的一个对象池,有很多不足的地方,但是对象池的原理已经体现了出来,适合刚开始接触对象池技术的人学习使用
基于对象池模式的自适应线程池技术 。。。。。
本文将探讨对象池的技术特性以及源码实现。 对象池类图 ObjectPool:管理对象实例的pool。 Client:使用者。 适用性: 类的实例可重用。 类的实例化过程开销较大。 类的实例化的频率较高。 效果: 节省了创建类实例...
基于面向对象技术的通用LDAP目录访问连接池,包括连接数限制算法。
下面通过一个简单的样例来说明如何利用apache common pool来应用对象池。 假定我现在有一个任务,就是对一堆字符串进行格式化,为了加快速度,采用了多线程的方式允许,而格式化则是通过对象StringFormat来实现。 ...
java内存优化资料汇总 一.代码优化 1.别用new Boolean 2.别用new Integer 3.用StringBuffer代替字符串相加 ...8.对频繁使用的对象采用对象池技术 9.保证每个IO操作,connection及时关闭 二.图片优化 三.工具优化
特别值得一提的是,教程中还涉及了游戏AI的编程方法、对象池技术、协程的详解以及Unity事件系统,这些都是游戏开发中非常实用的高级技术。通过学习,读者不仅能够掌握Unity游戏开发的核心技能,还能深入理解游戏设计...
Golang之sync.Pool对象池对象重用机制总结.md
系统采用对象池技术,当产品处于非活动状态时会被系统自动清除,当有新的请求时产品会被重新加载,使系统资源得到有效的利用,也可以通过优化系统参数来优化系统的性能,即使面对高强度的消息请求系统优秀的缓冲技术...
14.3.1 对象池技术和享元模式 14.3.2 享元模式在任务调度系统中的应用 14.3.3 范例小结 第15章 代理模式(Proxy) 15.1 模式解说 15.2 结构和用法 15.2.1 模式结构 15.2.2 代码模板 15.3 范例与实践 15.3.1...
14.3.1 对象池技术和享元模式 14.3.2 享元模式在任务调度系统中的应用 14.3.3 范例小结 第15章 代理模式(Proxy) 15.1 模式解说 15.2 结构和用法 15.2.1 模式结构 15.2.2 代码模板 15.3 范例与实践...
为了进一步缩短Web环境下决策支持的响应时间,在分析原Web环境下OLAP(On-LineAnalyticalProcessing)系统所存在问题的基础上,将对象池技术和数据缓存技术引入到0LAP决策支持系统中,给出了一种新的Web环境下的OLAP...
如果我们在客户端频繁使用ajax技术,那么我们就不得不多次创建xmlhttp对象。当然,如您所知,我们可以改进创建的方式,比如使用全局变量来缓存一个实例(客户端的单例模式?!),对于同步方式的通信,这是很有效的...