- 浏览: 60923 次
- 性别:
- 来自: 北京
最新评论
-
suifeng214:
想问一下 楼主高并发是怎样测试的
java连接池性能测试报告 -
HeartArea:
这个不错,先留着
Tomcat jdbc-pool 与 commons DBCP 的参数对比【翻译全部属性】 -
chaodongyue:
求测试代码
java连接池性能测试报告 -
duzc2:
chgyan 写道 guangyan ?
服务端Mina线程关系和数据流动分析 -
chgyan:
服务端Mina线程关系和数据流动分析
介绍
org.apache.tomcat.jdbc.pool 包的 JDBC 连接池被用来替代 commons-dbcp 连接池。
为什么我们需要一个新的连接池?
有这样一些原因:
1. commons-dbcp 是单线程的,即使是查询验证过程也以线程锁锁定整个池。
2. commons-dbcp 性能低下——在 cpu 核心数量不断成长的今天,即使 Java6 对同步关键字提供巨大优化效果, commons-dbcp 仍然不支持高并发。
3. commons-dbcp 复杂度高,超过 60 个类, tomcat-jdbc-pool 只有 8 个核心类,可以最小修改量应对对未来需求。你需要的仅仅是一个连接池,其他的都不重要。
4.
commons-dbcp
使用静态接口。意味着你不能在
JDK1.6
下编译它,否则即使驱动程序支持的方法,
dbcp
不支持的方法,在运行时也将出现
NoSuchMethodException
异常。
5. commons-dbcp 呆滞。更新、释放和对新特性的支持相当缓慢。
6. 如果可以简单得多的方式实现连接池,我们就不需要重写 60 多个类。
7. Tomcat JDBC 连接池支持公平列队选项,这在 commons-dbcp 上是不支持的,但性能仍然比 commons-dbcp 快。
8. Tomcat JDBC 连接池可以在不开启新线程的情况下异步地回收连接。
9. Tomcat JDBC 连接池吃一个 Tomcat 模块,依赖于 Tomcat JULI ——一个 Tomcat 使用的精简的日志框架。
10.
收回使用
javax.sql.PooledConnection
接口的相关连接。
11.
饥饿测试。如果一个池是空的,并且有线程正在等待一个连接,当一个连接被退还,这个池将唤醒当前等待的线程。多数连接池会被饿死。
相比其他连接池实现增加的特性:
1. 支持多线程环节和多核心 /cpu 系统。
2. 动态实现接口,可支持特定 runtime 的 java.sql 和 javax.sql 接口(需 JDBC 驱动支持),即使在低版本的 JDK 编译。
3. 验证间隔——没有在每次使用连接时进行验证,而仅仅在取用和归还连接时,我们只需要配置最高验证频率。
4. 单次查询——当数据库创建连接之后,可以执行一个可配置的查询。当你需要整个连接期间只需要查询一次的话,这个功能非常有用。
5. 可以配置自定义拦截器。允许你自定义拦截器来增加新的功能。可以利用拦截器收集查询状态,缓存会话状态,连接失败重连,重试查询,缓存查询结果等等。动态的拦截器使你有无穷的创意,不必被 JDK 提供的 java.sql/javax.sql 接口捆绑。
6. 高性能——稍候我们将展示不同的性能表现。
7. 简单扩展,因为有非常简单的实现,代码行数和源文件数量都非常少,对比 c3p0 拥有 200 多个源文件(上次我们检查的结果), Tomcat JDBC 连接池只有 8 个核心文件,连接池本身更只有一半大小。如果出现 bug ,他们非常容易跟踪和修复。降低复杂度更能集中精力。
8.
异步连接回收——你可以执行一个查询,并使用
Future<Connection>
异步取得。
9.
更好的闲置连接处理。相比直接关闭闲置连接,它能回收连接并使用更智能的算法修整闲置连接大小。
10.
你可以决定什么时候考虑丢弃一个连接,当连接池满,或直接设置一个超时。
11.
丢弃的连接计数器将在statement/query
完成之后。允许一个正在被使用的连接存在更长时间而不超时。这个功能由ResetAbandonedTimer
实现。
12.
指定在连接创建后一个时间点关闭它。基于连接回收次数控制。
13.
连接被丢弃后发送JMX
通知和日志条目。这和removeAbandonedTimeout
非常相似,但不做任何动作,只是报告一条消息。这个实现使用suspectTimeout
属性。
14.
可以通过java.sql.Driver
,
javax.sql.DataSource
或
javax.sql.XADataSource
取得连接,这个实现使用dataSource
和dataSourceJNDI
属性。
15.
支持XA
连接。
使用方法
为了熟悉 commons-dbcp 的用户, Tomcat 连接池的使用方法被设计得尽可能简单,过度非常简单。从其他连接池迁移也很容易。
附加特性
Tomcat 连接池在其他连接池之外还提供一些附加特性:
l initSQL ——在连接建立之后执行一次 SQL
l 验证间隔——避免高频率的验证
l Jdbc 拦截器——灵活、可插拔的拦截器,可自定义连接池、查询和结果集。更多描述在高级部分
l 公平列队——设置 fair 标记为 true 来实现公平或异步连接回收
集成 Apache Tomcat 容器
遵守
The
Tomcat JDBC documentation
描述,
Tomcat
连接池被配置为一个资源,。唯一的不同是你必须指定
factory
属性,并且这是
value
为
org.apache.tomcat.jdbc.pool.DataSourceFactory
。
独立运行
连接池只有一个依赖——
tomcat-juli.jar
。使用
org.apache.tomcat.jdbc.pool.DataSource
类实例Bean
在独立项目中配置连接池。你可以用后面描述的属性,像使用Bean
一样将连接池配置为JNDI
资源。
JMX
连接池对象公开一个可以被注册的 Mbean 。 jmxEnabled 属性必须设为 true ,连接池才会建立 MBean 。连接池不负责注册这个 Mbean ,只负责建立。 ** 杜天微注:后面与我们无关了,先不翻译了。
属性
为了简化切换 commons-dbcp 和 Tomcat JDBC 池,多数属性和 commons-dbcp 相同,并有相同的意义。
JNDI Factory 和 Type
属性 |
描述 |
Factory |
Factory
是必需的,并且值必须为
|
Type |
类型应该永远为
|
普通属性
这些属性是 commons-dbcp 和 tomcat-jdbc-pool 共享的,有些属性的默认值不同。 ** 杜天微注:这个常用不翻译了
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tomcat 连接池增加的属性 |
Description |
|
initSQL |
(String) 当连接第一次建立时执行的SQL ,默认值为null 。 A custom query to be run when a connection is first created. The default value is null . |
jdbcInterceptors |
(String) A semicolon separated list of classnames
extending
org.apache.tomcat.jdbc.pool.JdbcInterceptor
class. These interceptors will be inserted as an
interceptor into the chain of operations on a
java.sql.Connection
object. The default value is
null
. |
validationInterval |
(long) 避免过度验证,保证验证不超过这个频率——以毫秒为单位。如果一个连接应该被验证,但上次验证未达到指定间隔,将不再次验证。默认值是30000 (30 秒)。 avoid excess validation, only run validation at most at this frequency - time in milliseconds. If a connection is due for validation, but has been validated previously within this interval, it will not be validated again. The default value is 30000 (30 seconds). |
jmxEnabled |
(boolean) Register the pool with JMX or not. The default value is true . |
fairQueue |
(boolean) 如果被设为true ,getConnection 方法将被以先进先出的方式对待。此属性使用 org.apache.tomcat.jdbc.pool.FairBlockingQueue 实现闲置连接列表。默认值是true 。 如果需要使用异步连接回收,这个标记是必须的。 这个标记确保线程取得连接的顺序和他们调用getConnection 方法的顺序是相同的。 在性能测试中,这个标记对锁和锁等待有非常大的影响。当fairQueue=true ,将有一个依赖于操作系统的线程作为决定线程。如果是Linux 系统( 系统属性os.name=Linux )。可以在线程池的类加载之前设置系统属性 org.apache.tomcat.jdbc.pool.FairBlockingQueue.ignoreOS=true 关闭Linux 特定行为但仍然使用公平队列 ) ** 杜天微注:这里好像有句话没说完?不同系统有什么不同行为? Set to true if you wish that calls to getConnection
should be treated fairly in a true FIFO fashion. This uses the
org.apache.tomcat.jdbc.pool.FairBlockingQueue
implementation for the list of the idle connections.
The default value is
true
. This flag is required when
you want to use asynchronous connection retrieval. |
abandonWhenPercentageFull |
(int) Connections that have been abandoned (timed out) wont get closed and reported up unless the number of connections in use are above the percentage defined by abandonWhenPercentageFull . The value should be between 0-100. The default value is 0 , which implies that connections are eligible for closure as soon as removeAbandonedTimeout has been reached. |
maxAge |
(long) Time in milliseconds to keep this connection. When a connection is returned to the pool, the pool will check to see if the now - time-when-connected > maxAge has been reached, and if so, it closes the connection rather than returning it to the pool. The default value is 0 , which implies that connections will be left open and no age check will be done upon returning the connection to the pool. |
useEquals |
(boolean) Set to true if you wish the ProxyConnection class to use String.equals and set to false when you wish to use == when comparing method names. This property does not apply to added interceptors as those are configured individually. The default value is true . |
suspectTimeout |
(int) Timeout value in seconds. Default value is
0
. |
rollbackOnReturn |
(boolean) If autoCommit==false then the pool can terminate the transaction by calling rollback on the connection as it is returned to the pool Default value is false . |
commitOnReturn |
(boolean) If autoCommit==false then the pool can complete the transaction by calling commit on the connection as it is returned to the pool If rollbackOnReturn==true then this attribute is ignored. Default value is false . |
alternateUsernameAllowed |
(boolean) By default, the jdbc-pool will ignore the DataSource.getConnection(username,password)
call, and simply return a previously pooled connection under the globally
configured properties
username
and
password
, for performance reasons. The pool can however be used
with different credentials each time a connection is used. Should you request
a connection with the credentials user1/password1 and the connection was
previously connected using user2/password2, the connection will be closed,
and reopened with the requested credentials. This way, the pool size is still
managed on a global level, and not on a per schema level. To enable the
functionality described in the DataSource.getConnection(username,password)
call, simply set the property
alternateUsernameAllowed
to true. |
dataSource |
(javax.sql.DataSource) Inject a data source to the connection pool, and the pool will use the data source to retrieve connections instead of establishing them using the java.sql.Driver interface. This is useful when you wish to pool XA connections or connections established using a data source instead of a connection string. Default value is null |
dataSourceJNDI |
(String) The JNDI name for a data source to be looked up in JNDI and then used to establish connections to the database. See the dataSource attribute. Default value is null |
useDisposableConnectionFacade |
(boolean) Set this to true if you wish to put a facade on your connection so that it cannot be reused after it has been closed. This prevents a thread holding on to a reference of a connection it has already called closed on, to execute queries on it. Default value is true . |
logValidationErrors |
(boolean) Set this to true to log errors during the validation phase to the log file. If set to true, errors will be logged as SEVERE. Default value is false for backwards compatibility. |
propagateInterruptState |
(boolean) Set this to true to propagate the interrupt state for a thread that has been interrupted (not clearing the interrupt state). Default value is false for backwards compatibility. |
发表评论
-
在 Eclipse 里使用 Java 6 注解处理器
2012-06-29 23:49 3578在 Eclipse 里使用 Java 6 注解处理器 ... -
JDK 7 特性
2012-06-29 00:09 1448JDK 7 特性 虚拟机 JSR 292:支持动 ... -
Java SE 7 和 JDK 7 兼容性
2012-06-29 00:08 5996Java SE 7 和 JDK 7 兼容性 兼 ... -
java的Integer缓冲
2012-05-28 15:14 2548java.lang.Integer.valueOf ... -
DBCP和Tomcat jdbc-pool 对比
2012-05-23 17:29 3506一 性能 低并发情况下DBCP略强于jdbc-pool,高 ... -
Tomcat jdbc-pool 与 commons DBCP 的参数对比【翻译全部属性】
2012-05-22 17:33 3905通用属性 属性名 描述(DBCP/To ... -
不同并发量下Tomcat jdbc-pool和DBCP连接池的性能和包依赖
2012-05-22 11:47 3086最小连接5,最大连接50,无延迟,排除预热,循环查询“sele ... -
[翻译]DBCP释放历史
2012-05-22 00:28 1496版本日期 描述 ... -
[翻译]Why another connection pool project?为什么还需要另外的连接池项目?
2012-05-22 00:01 1767英文原文: http://www.tomcatexpert.c ... -
java连接池性能测试报告
2012-05-21 13:39 11370一 当前问题 1 ... -
JAVA NIO和MINA发送数据过程解析
2012-05-11 14:30 4414NIO发送数据过程: 1 将 ... -
开发环境Eclipse和GameServer的JVM调优
2012-05-11 10:03 1603杜天微 2012-3-29 系统信息: XP SP ... -
JVM编译期字符串连接优化分析
2012-05-11 09:57 2334为了研究javac对于String ... -
为了研究变量声明在for语句块前和for语句块内部的区别
2012-05-11 09:54 1233编译并反编译BeforeFor和InFor,对比如图《java ... -
服务端Mina线程关系和数据流动分析
2012-05-11 09:50 3668一 线程关系 NioSocketAcceptor类 线 ...
相关推荐
在Tomcat环境下,连接池通常使用Apache Commons DBCP(Database Connection Pool)来管理数据库连接。默认情况下,DBCP会直接读取配置文件中的用户名和密码,这意味着这些信息是以明文形式存在的。一旦服务器被非法...
### Tomcat6配置连接池详解 #### 一、引言 在Java Web开发中,数据库连接池技术的应用极为广泛。合理的数据库连接管理不仅能提高应用程序的性能,还能有效避免因频繁创建销毁连接所导致的资源浪费问题。Apache ...
Tomcat 连接池配置需要在 Maven 项目中添加 Tomcat JDBC 依赖项,并在 application.properties 文件中配置数据库连接信息。下面是 Tomcat 连接池的配置示例: ```xml <!-- Tomcat JDBC 依赖项 --> <groupId>org....
在Java中,常见的JDBC连接池实现有Apache的DBCP、C3P0、HikariCP、Tomcat JDBC Connection Pool等。这些连接池都遵循一定的设计模式,如工厂模式用于创建连接,池化模式用于管理连接,确保在需要时能够快速提供连接...
在IT行业中,数据库连接管理是应用系统性能优化的关键一环,而JDBC连接池就是解决这一问题的有效工具。本文将深入探讨如何自定义JDBC连接池,并对常用的连接池技术进行介绍。 首先,自定义JDBC连接池的核心在于管理...
本文将详细介绍如何配置Tomcat的连接池,即Catalina自带的`Apache Commons DBCP2`或`Apache Tomcat JDBC Pool`。 **一、Tomcat连接池的引入** Tomcat默认并未开启连接池,我们需要手动配置。首先,在Tomcat的`conf...
这个数据源是Tomcat内建的一种连接池,它在性能和内存管理上比标准的Java JDBC连接池更优秀,尤其适用于高并发的Web应用。 标题中提到的"tomcat-jdbc.jar"和"tomcat-juli.jar"是使用Tomcat-jdbc数据源所必需的两个...
《深入理解Tomcat JDBC连接池7.0.42版》 在Java Web开发中,数据库连接管理是至关重要的部分,而Tomcat JDBC连接池(也称为Tomcat JNDI DataSource Provider)则是一个高效、轻量级且功能丰富的连接池实现。这个...
在Tomcat、WebLogic、WebSphere等应用服务器中,通常通过在配置文件中声明资源的方式来配置JDBC连接池,这使得多个应用程序可以共享同一个数据库连接池,提高资源利用率。 ### 描述解读:“多种:jdbc连接池资源...
NULL 博文链接:https://jackyin5918.iteye.com/blog/1922379
《TOMCAT数据库连接池配置详解》 TOMCAT数据库连接池配置是Java Web开发中不可或缺的一环,它能够有效地管理和优化数据库连接,提高系统性能。以下是对TOMCAT数据库连接池配置的详细说明。 首先,你需要下载TOMCAT...
Tomcat作为轻量级应用服务器,提供了一个内置的连接池模块,称为`Apache Tomcat JDBC Connection Pool`,它允许开发者有效地管理数据库连接,避免频繁创建和销毁连接导致的性能开销。连接池通过预先创建并维护一定...
1. **选择连接池实现**:首先,我们需要选择一个合适的数据库连接池实现,如Apache的DBCP、C3P0、HikariCP或Tomcat JDBC连接池等。这些连接池库提供了管理和维护数据库连接的功能。 2. **配置连接池**:在应用的...
Tomcat中的JDBC连接池(通常称为Tomcat JDBC或Commons DBCP)支持多种不同的数据库,包括MySQL、Oracle、PostgreSQL等,这对于开发跨平台的应用程序非常有用。 在标签“java_tomcat_jdbc tomcat_jdbc”中,"tomcat_...
本文将详细探讨Tomcat连接池的配置,包括其原理、配置步骤以及优化策略。 一、连接池原理 连接池是一种资源管理技术,用于存储数据库连接。它预先创建一定数量的数据库连接,当应用程序需要时可以从池中获取,使用...
在Java开发中,Tomcat作为一款广泛使用的应用服务器,提供了对数据库连接池的支持,使得应用程序可以高效、便捷地管理数据库连接。本文将详细介绍如何在Tomcat中配置和使用数据库连接池,以及相关的知识点。 首先,...
在Tomcat 6.0中,配置JDBC连接池通常是在`conf/context.xml`文件中进行的。以下是一个基本的配置示例: ```xml <Resource name="jdbc/EmployeeDB" auth="Container" type="javax.sql.DataSource" driverClassName=...
JDBC连接池是在应用服务器启动时创建一系列的数据库连接,将其保存在内存中,当应用程序需要与数据库交互时,不再直接创建新的连接,而是从连接池中获取一个已经存在的连接,用完后也不直接关闭,而是归还给连接池...