Java程序性能优化-对象复用“池”(1)

Java程序性能优化-对象复用“池”(1),第1张

  对象复用 池 ( )

对象池化 是目前非常常用的一种系统优化技术 它的核心思想是 如果一个类被频繁请求使用 那么不必每次都生成一个实例 可以将这个类的一些实例保存在一个 池 中 待需要使用的时候直接从池中获取 这个 池 就称为对象池 在实现细节上 它可能是一个数组 一个链表或者任何集合类

对象池的使用非常广泛 其中最为大家所熟悉的 就是线程池和数据库连接池 线程池中 保存著可以被重用的线程对象 当有任务被提交到线程池时 系统并不需要新建线程 而是从池中获得一个可用的线程 执行这个任务 在任务结束后 也不关闭线程 而将它返回到池中 以便下次继续使用 由于线程的创建和销毁是较为费时的工作 因此 在线程调度频繁的系统中 线程池可以很好地改善性能 有关线程池更详细的介绍 读者可以参考第 章中 简单的线程池实现 一节

数据库连接池也是一种特殊的对象池 它用于维护数据库连接的集合 当系统需要访问数据库时 不需要重新建立数据库连接 而可以直接从池中获取 在数据库 *** 作完成后 也不关闭数据库连接 而是将连接返回到连接池中 由于数据库连接的创建和销毁是重量级的 *** 作 因此 避免频繁进行这两个 *** 作 对改善系统的性能也有积极意义

注意 在程序中使用数据库连接池和线程池 可以有效地改善系统在高并发下的性能 这是两个非常重要的性能组件 任何对性能敏感的系统 都需要考虑合理配置这两个组件

目前应用较为广泛的数据库连接池组件有C P 和Proxool 其中C P 是伴随着Hibernate一起发布 与Hibernate联系紧密的数据库连接池 本文以C P 为例 展示数据库连接池的一般使用方法和特性

若在Hibernate中使用C P 连接池 只需要将C P 的jar包复制到开发环境中 并且在hibernate cfg xml中加入以下配置项即可

<property name= connection provider_class > hibernate connection

C P ConnectionProvider</property>

<property name= connection autoReconnect >true</property>

<property name= connection autoReconnectForPools >true</property>

<property name= connection is connection validation required >true

</property>

<! 最大连接数 >

<property name= hibernate c p max_size > </property>

<! 最小连接数 >

<property name= hibernate c p min_size > </property>

<! 获得连接的超时时间 如果超过这个时间 会抛出异常 单位毫秒 >

<property name= hibernate c p timeout > </property>

<! 最大的PreparedStatement的数量 >

<property name= hibernate c p max_statements > </property>

<! 每隔 秒检查连接池里的空闲连接 单位是秒 >

<property name= hibernate c p idle_test_period > </property>

<! 当连接池里的连接用完时 C P 一次性获取的新的数据库连接数 >

<property name= hibernate c p acquire_increment > </property>

<! 每次都验证连接是否可用 >

<property name= hibernate c p validate >true</property>

当然 也可以脱离Hibernate单独在应用程序中使用C P 以下代码构造了一个C P 的数据库连接池 并从中获得一个数据库连接

DataSource unpooled = DataSources

unpooledDataSource(

jdbc:mysql:// : /test //连接MySQL数据库

root )                             //这个不是连接池

DataSource pooled = DataSources pooledDataSource(unpooled)

//构建了一个连接池

con = pooled getConnection()                            //从连接池中获取连接

       返回目录 Java程序性能优化 让你的Java程序更快 更稳定

编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

       J ME移动开发实战教学视频

Visual C++音频/视频技术开发与实战

Oracle索引技术

lishixinzhi/Article/program/Java/gj/201311/27801

追问: 多线程访问数据库,其中有一个线程会长时间占用数据库。这个线程是独立线程,另外有一个线程池也会访问数据库,这个线程池中的线程我用lock锁住数据库了,但是由于独立线程和线程池线程不在同一个方法中,所以访问数据库的时间不同,用lock只能对线程池线程有效 回答: 你这么讲一定能保证两个线程不会在一个时刻共同发起对数据库的访问么?除非你做了很多同步让两个线程都按照你设计的逻辑不发生访问数据库的冲突,否则你必须加锁。看你的说明,你应该没加同步,所以他会出现冲突,你不能缺锁,他是共享资源的访问了。 追问: 恩,好的。受教了。

由于client发起tcp syn握手后,等待server发送tcp syn ack应答但是如果server连接数过多等,会无法应答 client会等待3秒后重新发送tcp syn请求建立连接这下明晰了

解决方法当然不是简单的增大那两个值如果可以用线程池当然最好,但是如果使用无法提供线程池的语言,比如php,就只能暂时加大参数,提高处理速度了

以上就是关于Java程序性能优化-对象复用“池”(1)全部的内容,包括:Java程序性能优化-对象复用“池”(1)、多线程 *** 作数据库,如何避免冲突除了用lock加锁以外 还有其他方式吗、高并发 数据库连接失败 怎么解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9708010.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存