Tomcat的JDBC连接池

来源:互联网 发布:软件行业销售模式 编辑:程序博客网 时间:2024/05/22 03:49

 

TomcatJDBC连接池

简介

    JDBC连接池org.apache.tomcat.jdbc.pool 是更换或替代公地DBCP 连接池。

    那么,为什么我们需要一个新的连接池?

    这里有几个原因:

    1. 公地DBCP是单线程的,以线程安全的commons-DBCP锁全池,即使在查询验证。
    2. 公地DBCP是缓慢的-作为逻辑CPU的数量增长,性能会受到影响,以上观点表明,不为高并发支持即使在的巨大优化同步 Java 6中陈述,公地DBCP仍然存在着速度和并发性。
    3. 公地DBCP是复杂的,超过60班。TomcatJDBC池,核心为8类,因此修改为未来的需求将需要少得多的变化。这是所有你需要运行的连接池本身,其余的是肉汁。
    4. 公地DBCP使用静态接口。这意味着你不能与JDK 1.6编译它,或者如果你运行在JDK 1.6 / 1.7,你会得到NoSuchMethodException所有未实现的方法,即使驱动程序支持它。
    5. 公地DBCP已成为相当停滞。稀疏的更新,版本和新功能的支持。
    6. 这不值得重写超过60班,当一些作为连接池可以实现为一个更简单的实现。
    7. TomcatJDBC池实现不具备的公平性选项公地DBCP,仍然表现比公地DBCP更快
    8. TomcatJDBC池实现的能力,检索异步连接,无需增加额外的线程库本身
    9. TomcatJDBC池是一个Tomcat模块,这取决于Tomcat的巨力,在Tomcat中使用了简化的日志框架。
    10. 检索使用javax.sql.PooledConnection中的接口的基础连接。
    11. 饥饿的证明。如果池是空的,线程正在等待连接,当返回连接池将清醒正确的线程等待。大多数池只会饿死。

    通过添加其他连接池实现功能

    1. 支持高并发环境和多核心/ CPU系统。
    2. 动态实现的接口,当与JDK较低版本的编译支持的java.sqljavax.sql中的接口为您的运行时环境(只要你的JDBC驱动程序不相同),均匀。
    3. 验证时间间隔 -我们没有验证每一次我们使用的连接,我们可以做到这一点,当我们借用或返回的连接,只是没有比我们更可以配置的间隔频繁。
    4. 润一旦查询,一个可配置的查询,将只能运行一次,当建立连接到数据库。非常有用的,以设置会话设定,要在建立连接的整个时间存在。
    5. 能够配置自定义拦截。这使您可以编写自定义拦截器来增强功能。您可以使用拦截器来收集查询统计信息,缓存会话状态,重新连接后故障的连接,重试查询,缓存查询结果,等等。您的选择是无止境的,拦截器是动态的,不依赖于JDK版本的java.sql / javax.sql中的接口。
    6. 高性能 -我们将在后面的一些性能差异
    7. 极其简单,由于非常简单的实现中,行数和源文件的数量是非常低的,比较有C3P0,有超过200个源文件(我们最后一次检查),TomcatJDBC有一个核心的8个文件,连接池本身约一半。由于可能出现的错误,他们会更快追查,也更容易解决。降低复杂性已经从成立之初的焦点。
    8. 异步连接检索 -你可以排队的请求的连接,并获得未来<连接>回来。
    9. 更好的空闲连接处理。而不是直接关闭连接的,它仍然可以集中连接,大小与一个更聪明的算法空闲池。
    10. 你可以决定在什么时刻连接视为放弃,就是它时,池已满,或者直接在超时通过指定池的使用门槛。
    11. 该放弃的连接定时器将重置在一份声明中/查询活动。允许一个连接正在使用很长一段时间不超时。这是使用ResetAbandonedTimer实现
    12. 他们已经连接了一段时间后,关闭连接。根据年龄接近在返回到池中。
    13. 获取JMX通知和日志条目时,连接被怀疑为被遗弃。这是类似于removeAbandonedTimeout但它不采取任何行动,只报告的信息。这是通过使用所达到的suspectTimeout属性。
    14. 连接可以从一个被检索java.sql.Driver中,javax.sql.DataSource中 或javax.sql.XADataSource中 这是通过使用所获得的数据源和dataSourceJNDI属性。
    15. XA连接支持

 

如何使用

Tomcat的连接池的使用已是尽可能简单,对于那些你熟悉的commons-DBCP,该过渡将是非常简单的。移动与其他连接池也相当直截了当。

附加功能

    Tomcat的连接池提供超过大多数其他池让你做一些额外的功能:

    • initSQL -运行SQL语句只出现一次的能力,在创建连接时
    • validationInterval -除了在连接运行验证时,避免在过于频繁。
    • jdbcInterceptors -灵活,可插拔拦截器来创建池周围,查询执行和结果集处理任何自定义。更多关于这方面的先进部分。
    • fairQueue -将公平标志设置为true来实现线程的公平性,或使用异步连接检索

里面的Apache Tomcat的集装箱

Tomcat的连接池配置中所描述的资源TomcatJDBC文档 ,唯一的区别是,你必须指定厂家属性并将其值设置为org.apache.tomcat.jdbc.pool.DataSourceFactory

独立

连接池只有另一个的依赖,这是Tomcatjuli.jar要配置使用的bean实例化一个独立的项目池,这个bean实例是 org.apache.tomcat.jdbc.pool.DataSource。相同的属性(后面介绍),你用它来 ​​配置一个连接池的JNDI资源,用于配置数据源作为一个bean。

JMX

连接池对象公开可以注册一个MBean为了使连接池对象来创建MBean中,标志jmxEnabled必须被设置为真。这并不意味着该池将与一个MBean服务器中注册,仅仅是该MBean被创建。在如Tomcat容器,Tomcat本身注册到MBean服务器的数据源,该 org.apache.tomcat.jdbc.pool.DataSource对象将然后注册实际的连接池的MBean。如果你正在运行一个容器之外,你可以自己注册的DataSource下您指定的任何对象名称,并将它传播登记到底层池。

属性

为了提供一个非常简单的开关,并从公地DBCPtomcat-JDBC池,大部分的属性是一样的,并具有相同的含义。

JNDI工厂和类型

 

属性

描写

工厂

工厂是必需的,并且该值应org.apache.tomcat.jdbc.pool.DataSourceFactory

类型

类型应始终javax.sql.DataSource或javax.sql.XADataSource中

根据类型一个org.apache.tomcat.jdbc.pool.DataSource或org.apache.tomcat.jdbc.pool.XADataSource将被创建。

公共属性

这些属性公地DBCPtomcat-JDBC池之间共享的,在某些情况下,默认值是不同的。

属性

描写

defaultAutoCommit

(布尔)默认自动提交该池创建的连接状态。如果没有设置,默认值是JDBC驱动程序默认(如果没有设置那么的setAutoCommit方法将不会被调用。)

defaultReadOnly

(布尔)默认只读此池创建的连接状态。如果没有设置,通过setReadOnly方法将不会被调用。(某些驱动程序不支持只读模式,例如:Informix的)

defaultTransactionIsolation

(字符串),由该池创建的连接的默认TransactionIsolation状态。下列之一:(见的

javadoc* 无

* READ_COMMITTED 

* READ_UNCOMMITTED 

* REPEATABLE_READ 

* SERIALIZABLE 

如果没有设置,该方法不会被调用,则默认为JDBC驱动程序。

defaultCatalog

(字符串),由该池创建的连接的缺省目录。

driverClassName

string)的JDBC驱动程序的完全限定的Java类名称的情况下使用。该驱动程序必须来自同一个类加载器的tomcat-jdbc.jar访问

用户名

(字符串)连接的用户名要传递给我们的JDBC驱动程序建立连接。注意,在这一点上,的DataSource.getConnection(用户名,密码)不使用传递到方法的凭据。

密码

string)的连接密码要传递给我们的JDBC驱动程序建立连接。注意,在这一点上,的DataSource.getConnection(用户名,密码)不使用传递到方法的凭据。

maxActive

(中间体),可以从该池中被分配在同一时间活动连接的最大数目。默认值是100

maxidle

INT),其应保持在游泳池在所有时间的最大连接数。默认值是 maxActive:100 空闲连接定期检查(如果启用),并且空闲了长于连接minEvictableIdleTimeMillis 将被释放。(另见testWhileIdle)

minIdle

int)的已建立的连接,应保持在池在所有时间的最小数目。低于这个数字的连接池能收缩,如果验证查询失败。默认值是源自INITIALSIZE:10(另见testWhileIdle)

INITIALSIZE

INT),其池启动时创建的连接的初始数目。默认值是10

MAXWAIT

INT)毫秒池将等待(当没有可用的连接)的连接的最大数目抛出异常前返回。默认值是30000(30秒)

testOnBorrow

(布尔)是否将对象从池中借用前必须被确认的指示。如果对象无法验证,它将被从池中下降,我们将试图借用他人。注-一个真值,以产生任何效果,则validationQuery参数必须设置为一个非空串。默认值为false为了有一个更有效的验证,看validationInterval 默认值是假的

testOnReturn

(布尔值)的对象是否将被返回到池中被验证之前的指示。-一个真值,以产生任何效果,则validationQuery参数必须设置为一个非空串。默认值是假的。

testWhileIdle

(布尔值)的对象是否会由空闲对象逐出器被验证(如果有的话)的指示。如果一个对象无法验证,它将被从池中丢弃。注-一个真值,以产生任何效果,则validationQuery参数必须设置为一个非空串。默认值是假的,这酒店为了泳池清洁器/测试线程被设置为运行(参见timeBetweenEvictionRunsMillis)

validationQuery

(字符串)将用于他们返回给调用方之前验证从这个池连接的SQL查询。如果指定,此查询不返回任何数据,它只是不能抛出SQLException。默认值为空。示例值有SELECT 1(MySQL 的),选择1,从双(甲骨文),选择1(MS SQL SERVER)

validatorClassName

(字符串),它实现了一类的名称 org.apache.tomcat.jdbc.pool.Validator接口,并提供了一个无参数的构造函数(可能是隐含的)。如果指定了类将被用于创建一个验证器实例,然后用来代替任何验证查询验证的连接。默认值为空。一个例子值为 com.mycompany.project.SimpleValidator。

timeBetweenEvictionRunsMillis

INT)的毫秒数的空闲连接验证/清洁线运行之间睡觉。此值应不小于1秒进行设置。它决定了我们是如何经常检查空闲,废弃的连接,以及多久我们验证空闲连接。默认值是5000(5秒)。

numTestsPerEvictionRun

INT)属性不是TomcatJDBC池使用。

minEvictableIdleTimeMillis

INT)的时间对象可以闲坐在游泳池之前,有资格驱逐的最低金额。默认值是60000(60秒)。

accessToUnderlyingConnectionAllowed

未使用(boolean)属性。访问可以通过调用来实现展开的池连接。看javax.sql.DataSource的界面,或者叫的getConnection通过反射或或铸造的对象javax.sql.PooledConnection中

removeAbandoned

(布尔)标记删除废弃的连接,如果他们超过removeAbandonedTimout。如果设置为true的连接被视为放弃,并符合删除,如果它一直在使用长于removeAbandonedTimeout设置为true,可以从没有关闭连接的应用程序恢复数据库的连接。另请参见logAbandoned 的默认值是假的。

removeAbandonedTimeout

INT)超时(秒)之前一个废弃的(使用)连接可以被删除。默认值是60(60秒)。该值应设置为运行时间最长的查询,您的应用程序可能有。

logAbandoned

(布尔)标记登录为其放弃了连接的应用程序代码的堆栈跟踪。被遗弃的连接的记录增加了开销为每个连接借,因为堆栈跟踪已产生。默认值是假的。

ConnectionProperties

(字符串)建立新的连接时,将被发送到我们JDBC驱动的连接属性。该字符串的格式必须是[参数propertyName =财产;] *-“用户”和“密码”特性将被显式传递,所以他们并不需要被包括在这里。默认值为空。

poolPreparedStatements

未使用(boolean)属性。默认值是假的。

maxOpenPreparedStatements

未使用(INT)属性。默认值是假的。

TomcatJDBC增强属性

 

属性

描写

initSQL

(字符串)自定义查询首次创建连接时运行。默认值为空。

jdbcInterceptors

(字符串)用分号分隔的扩展类名的列表org.apache.tomcat.jdbc.pool.JdbcInterceptor类。这些拦截器将被插入作为拦截到操作对链条的java.sql.Connection对象。默认值为空,

预定义的拦截器

org.apache.tomcat.jdbc.pool.interceptor.ConnectionState -跟踪汽车的提交,只读,目录和事务隔离级别

org.apache.tomcat.jdbc.pool.interceptor。StatementFinalizer -跟踪开语句,并且当连接返回到池中关闭它们。

validationInterval

(长)避免过多的验证,只能运行验证顶多在这个频率-时间以毫秒为单位。如果一个连接是由于进行验证,但已在此间隔内以前验证,它不会被再次验证。默认值是30000(30秒)。

jmxEnabled

(布尔)注册使用JMX与否池。默认值是真。

fairQueue

(布尔)设置为true,如果你希望调用的getConnection应在真正的FIFO方式公平对待。这使用org.apache.tomcat.jdbc.pool.FairBlockingQueue 实施空闲连接列表。默认值是真。当你想使用异步连接检索这个标志是必需的。

设置该标志,可以确保线程接收连接在他们到达的顺序。

在性能测试中,有如何锁和锁等待实现了非常大的差异。当fairQueue =真> 有根据系统运行的是何种操作系统上的决策过程。如果系统运行在Linux上(属性os.name = Linux的。要禁用此Linux特有的行为,并仍采用公平队列,只需添加属性org.apache.tomcat.jdbc.pool.FairBlockingQueue.ignoreOS =真到你的系统连接池类之前的属性被加载。

abandonWhenPercentageFull

INT)已经放弃了(超时)不会得到封闭,并报告了,除非使用中的连接的数目由上面定义的百分比连接abandonWhenPercentageFull。该值应该在0-100之间。缺省值是0,这意味着连接获闭合只要 removeAbandonedTimeout已经达到。

最大生存周期

(长)以毫秒为单位保持这种连接。当一个连接被返回到池中,池将检查以查看是否现在-时间时连接>的MaxAge已经到达,并且如果是的话,它会关闭连接,而不是将其返回到池中。缺省值是0,这意味着连接将保持打开和不受年龄检查将在返回的连接到池中进行。

useEquals

(布尔)设置为true,如果你想在ProxyConnection使用类String.equals并设置为假 ,当你想使用==比较的方法名称时。此属性并不适用于添加拦截那些被单独配置。默认值是真。

suspectTimeout

INT)超时以秒为单位的值。默认值为0。 类似的removeAbandonedTimeout而不是把连接已被放弃,并有可能关闭连接的价值,但是,这只是记录了警告,如果 logAbandoned设置为true。如果该值等于或小于0,无疑检查将被执行。犯罪嫌疑人检查仅如果超时值大于0,连接没有抛弃或者放弃检测无效。如果连接是嫌疑人WARN消息被记录和JMX通知被发送一次。 

alternateUsernameAllowed

(布尔)默认情况下,JDBC池会忽略 的DataSource.getConnection(用户名,密码) 调用,并简单地返回在全球范围内配置的属性先前池连接用户名和密码,出于性能的考虑。池然而,可以用不同的凭据用于连接每一次使用。如果您要求的凭证USER1 /密码1的连接,并连接使用用户2 /密码2先前连接,该连接将被关闭,并重新打开与请求的凭证。这样一来,池大小是在全球范围还是管理的,而不是针对每个架构级别。为了使在所描述的功能 的DataSource.getConnection(用户名,密码) 呼叫,只需设置该属性alternateUsernameAllowed为true。

默认值是假的。

这家酒店加入作为增强缺陷50025。

数据源

javax.sql.DataSource的)

dataSourceJNDI

(字符串)

高级用法

 

JDBC拦截器

要了解如何使用拦截器的一个例子,看看 org.apache.tomcat.jdbc.pool.interceptor.ConnectionState。这个简单的拦截器的三个属性的高速缓存,事务隔离级别,自动提交和只读状态,以使系统避免不需要往返数据库。

进一步拦截器将被添加到池的核心根据需要。捐款总是受欢迎的!

拦截器当然不仅限于java.sql.Connection中,但可用于包装任何结果的距离的方法invokation为好。你可以建立查询性能分析器时,查询运行时间比预期的时间,提供了JMX通知。

JDBC拦截器

配置JDBC拦截器是通过使用jdbcInterceptors财产。该属性包含分号分隔的类名的列表。如果类名如果没有充分的资格,将与前缀 同 jdbcInterceptors =“ConnectionState; StatementFinalizer” 拦截器可以有属性为好。这些会的类名paranthesis中进行配置。示例 :jdbcInterceptors =“ConnectionState; StatementFinalizer(useEquals = TRUE)”

 

 

 

 

 

 

 

org.apache.tomcat.jdbc.pool.JdbcInterceptor

所有的拦截器的抽象基类,不能被实例化。

属性

描写

useEquals

(布尔)设置为true,如果你想在ProxyConnection使用类String.equals并设置为假 ,当你想使用==比较的方法名称时。默认值是真。

org.apache.tomcat.jdbc.pool.interceptor.ConnectionState

高速缓存用于以下连接属性自动提交,readOnly的 ,transactionIsolation和目录。它是一种性能增强,以避免往返到数据库时吸气剂调用或setter方法被称为与已设置的值。

属性

描写

org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer

跟踪使用创建的所有报表的createStatement,prepareStatement或方法prepareCall 和关闭这些语句当连接返回到池中。     

属性

描写

org.apache.tomcat.jdbc.pool.interceptor.StatementDecoratorInterceptor

见48392。拦截器来包装语句和结果集以防止访问使用的方法的实际连接ResultSet.getStatement()。的getConnection()和Statement.getConnection()

属性

描写

org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport

跟踪查询性能和问题日志条目时,查询超过失效的时间阈值。所使用的日志级别为WARN

属性

描写

门槛

INT为字符串)的毫秒数查询有超过发出警报日志之前。默认值是1000毫秒。        

maxQueries

INTString)查询,以便节省内存空间的缺省值是保持跟踪的最大数量1000。         

org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx

扩展了SlowQueryReport而除了日志条目它发出JMX通知监控工具来应对。继承所有来自它的父类的属性。这个类使用Tomcat的JMX引擎,所以它不会Tomcat容器外工作。缺省情况下,如果已启用JMX通知通过的ConnectionPool的mbean发送。该SlowQueryReportJmx也可以注册一个MBean如果notifyPool = FALSE

属性

描写

notifyPool

(布尔值,字符串),设置为false,如果你想JMX通知要去SlowQueryReportJmxMBean的默认值是真。

org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer

被遗弃的定时器启动时连接从池中检出。这意味着如果你有一个30秒超时,并使用它会被标记为废弃并根据潜在回收的连接上运行10x10second查询abandonWhenPercentageFull 属性。使用该拦截器将每次的连接上执行操作,或成功地执行查询时重置结账计时器。

属性

描写

代码示例

Tomcat的配置JDBC使用其他的例子可以发现Tomcat的文档中

纯醇'Java

下面是如何创建和使用数据源的简单的例子。

        进口java.sql.Connection中;
        进口java.sql.ResultSet中;
        进口java.sql.Statement中;
       
        进口org.apache.tomcat.jdbc.pool.DataSource;
        进口org.apache.tomcat.jdbc.pool.PoolProperties;
       
        公共类SimplePOJOExample {
       
            公共静态无效的主要(字串[] args)抛出异常{
                PoolProperties P =新PoolProperties();
                p.setUrl(“JDBC:mysql的://本地主机:3306 / MySQL的”);
                p.setDriverClassName(“com.mysql.jdbc.Driver”);
                p.setUsername(“根”);
                p.setPassword(“密码”);
                p.setJmxEnabled(真正的);
                p.setTestWhileIdle(假);
                p.setTestOnBorrow(真正的);
                p.setValidationQuery(“选择1”);
                p.setTestOnReturn(假);
                p.setValidationInterval(30000);
                p.setTimeBetweenEvictionRunsMillis(30000);
                p.setMaxActive(100);
                p.setInitialSize(10);
                p.setMaxWait(10000);
                p.setRemoveAbandonedTimeout(60);
                p.setMinEvictableIdleTimeMillis(30000);
                p.setMinIdle(10);
                p.setLogAbandoned(真正的);
                p.setRemoveAbandoned(真正的);
                p.setJdbcInterceptors(“org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;”+
                  “org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer”);
                数据源数据源=新的数据源();
                datasource.setPoolProperties(对);
               
                连接CON = NULL;
                尝试{
                  CON =的DataSource.getConnection();
                  声明ST = con.createStatement();
                  结果集RS = st.executeQuery(“SELECT * FROM用户”);
                  INT CNT = 1;
                  而(先将rs.next()){
                      的System.out.println((CNT ++)+“。主持人:”+ rs.getString(“主机”)+
                        “用户:”+ rs.getString(“用户”)+“密码:”+ rs.getString(“密码”));
                  }
                  rs.close();
                  st.close();
                } {最后
                  如果(!CON = NULL){尝试con.close();}赶上(异常忽略){}
                }
            }
       
        }
   

作为一种资源

这里是如何配置的JNDI查找资源的例子

    <资源名称=“的jdbc / TestDB的”
              AUTH =“容器”
              TYPE =“javax.sql.DataSource的”
              工厂=“org.apache.tomcat.jdbc.pool.DataSourceFactory”
              testWhileIdle =“真”
              testOnBorrow =“真”
              testOnReturn =“假”
              validationQuery =“SELECT 1”
              validationInterval =“30000”
              timeBetweenEvictionRunsMillis =“30000”
              maxActive =“100”
              minIdle =“10”
              MAXWAIT =“10000”
              INITIALSIZE =“10”
              removeAbandonedTimeout =“60”
              removeAbandoned =“真”
              logAbandoned =“真”
              minEvictableIdleTimeMillis =“30000”
              jmxEnabled =“真”
              jdbcInterceptors =
"org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
              用户名=“根”
              密码=“密码”
              driverClassName =“com.mysql.jdbc.Driver”
              URL =“的jdbc:mysql的://本地主机:3306 / MySQL的”/>

异步连接检索

TomcatJDBC连接池支持异步连接检索无需增加额外的线程池库。它通过添加一个方法来调用数据源做到这一点未来<连接> getConnectionAsync()。为了使用异步检索,两个条件必须满足

1您必须配置fairQueue属性是真实的 

2你必须投中的数据源org.apache.tomcat.jdbc.pool.DataSource

使用异步功能,下面显示的一个例子。

     
        连接CON = NULL;
        尝试{           
          未来<连接>未来= datasource.getConnectionAsync();
          而(!的Future.isDone()){
              的System.out.println(“连接尚不可用做一些后台的工作。”);
              尝试{
                  视频下载(100); //模拟工作
              }赶上(InterruptedException的X){
                  Thread.currentThread()()中断。
              }
          }
          CON =的Future.get(); //应立即返回
          声明ST = con.createStatement();
          结果集RS = st.executeQuery(“SELECT * FROM用户”);
     

 

拦截器

拦截器是一个强大的方式来启用,禁用或修改特定的连接或其子组件的功能。有许多不同的用例,当拦截器是有用的。默认情况下,对于性能方面的原因,连接池是无状态的。唯一的国家池本身刀片是defaultAutoCommit,defaultReadOnly,defaultTransactionIsolation,defaultCatalog如果这些设置。这4个属性只设置在连接创建。应的连接的使用期间这些属性被修改,池本身不会复位它们。

拦截器具有延长org.apache.tomcat.jdbc.pool.JdbcInterceptor类。这个类是相当简单的,你需要有一个无参数的构造函数

      
         公共JdbcInterceptor(){
         }
      

当一个连接被从池借用,拦截器可以初始化或以其它方式通过实施反应的情况下

      
         公共抽象无效复位(的ConnectionPool父,的PooledConnection CON);
      

方法。调用此方法有两个参数,一个引用连接池本身的ConnectionPool父母 和参考底层连接的PooledConnection CON。

当上的方法java.sql.Connection被调用对象,它会引起

         公共对象调用(对象代理,方法的方法,对象[]参数)抛出的Throwable
      

到被调用的方法。该方法的方法是调用的实际方法,以及对象[] ARGS是参数。看一个非常简单的例子,在这里我们将演示如何使invokation到java.sql.Connection.close()一个空操作,如果连接已关闭

      
        如果(CLOSE_VAL == method.getName()){
            如果(在isClosed())返回NULL; //空操作对于已经关闭。
        }
        返回super.invoke(代理,方法,参数);
       

有一个观察正在取得。它是方法名的比较。这样做的一个方法是做 “亲密”.equals(method.getName())。上面我们看到的方法名称和之间的直接引用比较静态最后弦乐参考。据JVM规范,方法名和静态最终字符串最终在一个共享常量池,所以参考比较应该工作。当然,人们可以做到这一点还有:

      
        如果(比较(CLOSE_VAL,法)){
            如果(在isClosed())返回NULL; //空操作对于已经关闭。
        }
        返回super.invoke(代理,方法,参数);
       

比较(字符串,法)将使用useEquals标志上拦截并做参考值比较,或当一个字符串值比较useEquals =真正的标志。

池开始/停止

当连接池已启动或关闭,您可以notifed你只会被通知每一次拦截器类,即使它是一个实例方法。并且会通知您使用目前没有连接到池的拦截器。

       公共无效poolStarted(的ConnectionPool池){
       }
      
       公共无效poolClosed(的ConnectionPool池){
       }
      

当重写这些方法,不要忘记调用超级如果要扩展一个类比其他JdbcInterceptor

配置拦截器

拦截器所使用的配置jdbcInterceptors属性或setJdbcInterceptors方法。拦截器可以有属性,会是这样配置

       字符串jdbcInterceptors =“org.apache.tomcat.jdbc.pool.interceptor.ConnectionState(useEquals =真,快= YES)”
      

拦截性能

由于拦截器可以有属性,你需要能够到你的拦截范围内读取这些属性的值。以像一个例子以上,可以覆盖setProperties方法。

       公共无效setProperties(地图<字符串,InterceptorProperty>属性){
           super.setProperties(属性);
           最后弦乐myprop =“myprop”;
           InterceptorProperty P1 = properties.get(myprop);
           如果(P1!= NULL){
               setMyprop(的Long.parseLong(p1.getValue()));
           }
       }
       

 

获得实际的JDBC连接

连接池,以便正确地集中他们创造周围的实际连接的包装。我们还建立在这些包装拦截器,以便能够执行某些功能。如果有必要检索实际连接,可以这样做的使用javax.sql.PooledConnection中 接口。

          连接CON =的DataSource.getConnection();
          连接实际=((javax.sql.PooledConnection中)CON).getConnection();
      

 

建造

我们建立与1.6JDBC池代码,但它是向后兼容下降到1.5运行时环境。对于单元测试中,我们使用1.6及更高版本

Tomcat的配置JDBC使用其他的例子可以发现Tomcat的文档中

从源代码编译

建筑是非常简单的。泳池有依赖的tomcat-juli.jar,倘若你想要的SlowQueryReportJmx

       javac的-classpath的tomcat-juli.jar \
             -d。\
             组织/阿帕奇/ tomcat的/ JDBC /游泳池/ *。java的\
             组织/阿帕奇/ tomcat的/ JDBC /游泳池/拦截器/ *。java的\
             组织/阿帕奇/ tomcat的/ JDBC /游泳池/ JMX / *。java的
   

构建文件可以在Tomcat中找到源代码库

为方便起见,构建文件也包含其中,一个简单的命令,会生成所需的所有文件。

        蚂蚁下载(下载依赖性)
        蚂蚁构建(编译并生成.jar文件)
        蚂蚁DIST(创建一个发布包)
        蚂蚁测试(运行测试,预计测试数据库进行设置)
     

0 0
原创粉丝点击