欢迎来到皮皮网网首页

【源码原创系统】【在b站买源码靠谱吗】【手机收发短信源码在哪】datasource接口源码_datasourcetransactionmanager源码

来源:spdif源码输出选项 时间:2024-11-25 00:52:52

1.cloud-init介绍及源码解读(上)
2.如何创建 DataSource
3.用DriverManager和DataSource获得Connection的区别在哪

datasource接口源码_datasourcetransactionmanager源码

cloud-init介绍及源码解读(上)

       cloud-init介绍及源码解读(上)

       cloud-init的接口基本概念

       metadata包含服务器信息,如instance id,源码源码display name等。接口userdata包含文件、源码源码脚本、接口yaml文件等,源码源码源码原创系统用于系统配置和软件环境配置。接口datasource是源码源码cloud-init配置数据来源,支持AWS、接口Azure、源码源码OpenStack等,接口定义统一抽象类接口,源码源码所有实现都要遵循规范。接口

       模块决定定制化工作,源码源码metadata决定结果。接口cloud-init配置有4个阶段:local、network、在b站买源码靠谱吗config、final。cloud-init支持多种userdata类型,如自定义Python代码、MIME文件等。用户数据类型包括User-Data Script(MIME text/x-shellscript)和Cloud Config Data(MIME text/cloud-config)。

       cloud-init支持多种datasource,包括NoCloud、手机收发短信源码在哪ConfigDrive、OpenNebula等。通过Virtual-Router获取metadata和userdata信息。

       cloud-init在云主机上创建目录结构以记录信息。cloud.cfg文件定义各阶段任务。

       cloud-init工作原理

       cloud-init通过从datasource获取metadata,执行四个阶段任务完成定制化工作。在systemd环境下,盒马微信小程序源码错误这些阶段对应的服务在启动时执行一次。

       local阶段从config drive中获取配置信息写入网络接口文件。network阶段完成磁盘格式化、分区、挂载等。config阶段执行配置任务。final阶段系统初始化完成,运行自动化工具如puppet、电视台直播源码网站怎么找salt,执行用户定义脚本。

       cloud-init使用模块指定任务,metadata决定结果。set_hostname模块根据metadata设置主机名。设置用户初始密码和安装软件是典型应用。

       cloud-init源码解读

       cloud-init核心代码使用抽象方法实现,遵循接口规范。主要目录包括定义类和函数、网络配置、模块初始化、系统发行版操作、配置文件管理、模块处理、数据源、事件报告等。

       模块通过handle函数解析cloud config配置,并执行逻辑。数据源类扩展实现接口。handler处理用户数据。reporting框架记录事件信息。

       cloud-init提供文件操作、日志管理、配置解析等辅助类。其他文件包括模板处理、日志格式定义、版本控制等。

       cloud-init通过模块、datasource和配置文件实现云主机元数据管理和定制化。源码结构清晰,功能全面,是云环境定制的强大工具。

如何创建 DataSource

       ã€€ã€€å…ˆçœ‹çœ‹JDK中对DataSource的描述:

       ã€€ã€€ä½œä¸º DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法。

       ã€€ã€€åŸºæœ¬å®žçŽ° - 生成标准的 Connection 对象

       ã€€ã€€è¿žæŽ¥æ± å®žçŽ° - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。

       ã€€ã€€ç®€å•æ¥è¯´,就是获取数据库连接的一个通用接口, 常见的dbcp,c3p0,druid,bonecp都是DataSource的实现.

       ã€€ã€€NutDao也选用DataSource作为获取数据库连接的方式, 且只调用其无参数的getConnection()方法, 也是大部分数据库连接池唯一支持的方法.

       ã€€ã€€è¿™ç¯‡æ–‡æ¡£è¯¥æ€Žä¹ˆç”¨?

       ã€€ã€€ç›´æŽ¥ä¹¦å†™ Java 代码

       ã€€ã€€å¦‚果你只是在main方法中尝试一下NutDao的功能,那么请选取Java

       ã€€ã€€é€šè¿‡ Nutz.Ioc 的 JSON 配置文件

       ã€€ã€€Nutz项目中最常见的配置方式, 由NutIoc来管理DataSource和NutDao实例

       ã€€ã€€ç‰¹åˆ«å¼ºè°ƒ, NutDao与NutIoc没有任何依赖关系, NutDao在NutIoc看来,只是普通的bean

       ã€€ã€€é€šè¿‡ Nutz.Ioc 的 XML 配置文件

       ã€€ã€€æ»¡è¶³XML强迫症的程序猿, 功能与JSON配置文件类似

       ã€€ã€€å†ç‰¹åˆ«ç‰¹åˆ«å¼ºè°ƒ

       ã€€ã€€NutDao几乎不需要任何配置文件(只有一个nutz_jdbc_experts.js 绝大部分时间你不会遇到它!)

       ã€€ã€€æœ¬æ–‡è¯´åˆ°çš„js/xml文件,都是NutIoc的文件,不是NutDao的配置文件!!

       ã€€ã€€ä¸è¦é‡å¤åˆ›å»ºDataSource,不要重复创建NutDao!!!!!!!

       ã€€ã€€åŠ¡å¿…参考本小节末尾的提醒!!

       ã€€ã€€å†…置的SimpleDataSource

       ã€€ã€€Nutz内置,非常适合新手!!无需额外下载其他连接池,方便尝试NutDao的功能.

       ã€€ã€€ä¸è¦ç”Ÿäº§çŽ¯å¢ƒä¸­ä½¿ç”¨è¿™ä¸ªDataSource!!

       ã€€ã€€ä¸è¦ç”¨å®ƒæ¥æµ‹è¯•NutDao的性能!!

       ã€€ã€€è‡ªåŠ¨åŠ è½½NutDao所支持的数据库的驱动(说白了就是我们认识那几款,不就Class.forName一下嘛)

       ã€€ã€€æ— é¢å¤–依赖,适合新手试用

       ã€€ã€€éžè¿žæŽ¥æ± ,配置简单

       ã€€ã€€1.b.开始提供,旧版本的Nutz可通过拷贝源文件的方式添加这个类

       ã€€ã€€SimpleDataSource: 直接书写 Java 代码

       ã€€ã€€import org.nutz.dao.impl.SimpleDataSource;

       ã€€ã€€...

       ã€€ã€€SimpleDataSource ds = new SimpleDataSource();

       ã€€ã€€//ds.setDriverClassName("org.postgresql.Driver"); //默认加载了大部分数据库的驱动!!

       ã€€ã€€ds.setJdbcUrl("jdbc:postgresql://localhost:/mydatabase");

       ã€€ã€€ds.setUsername("demo");

       ã€€ã€€ds.setPassword("");

       ã€€ã€€...

       ã€€ã€€//ds.close(); // 这个DataSource不是一个连接池,所以关不关都行

       ã€€ã€€SimpleDataSource: 通过 Nutz.Ioc 的 JSON 配置文件

       ã€€ã€€{

       ã€€ã€€dataSource : {

       ã€€ã€€type : "org.nutz.dao.impl.SimpleDataSource",

       ã€€ã€€fields : {

       ã€€ã€€jdbcUrl : 'jdbc:postgresql://localhost:/mydatabase',

       ã€€ã€€username : 'demo',

       ã€€ã€€password : ''

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€SimpleDataSource: 通过 Nutz.Ioc 的 XML 配置文件

       ã€€ã€€<ioc xsi:noNamespaceSchemaLocation="nutz-ioc-0.1.xsd">

       ã€€ã€€<obj name="dataSource" type="org.nutz.dao.impl.SimpleDataSource">

       ã€€ã€€<field name="jdbcUrl"><str>jdbc:postgresql://localhost:/mydatabase</str></field>

       ã€€ã€€<field name="username"><str>demo</str></field>

       ã€€ã€€<field name="password"><str></str></field>

       ã€€ã€€</obj>

       ã€€ã€€</ioc>

       ã€€ã€€é™„送一个完整的NutDao配置js文件

       ã€€ã€€var ioc = {

       ã€€ã€€dao : {

       ã€€ã€€type : "org.nutz.dao.impl.NutDao",

       ã€€ã€€args : [{ refer:"dataSource"}]

       ã€€ã€€},

       ã€€ã€€dataSource : {

       ã€€ã€€type : "org.nutz.dao.impl.SimpleDataSource",

       ã€€ã€€fields : {

       ã€€ã€€jdbcUrl : 'jdbc:postgresql://localhost:/mydatabase',

       ã€€ã€€username : 'demo',

       ã€€ã€€password : ''

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€å¦‚何使用这些配置? 请看文章末尾.

       ã€€ã€€Druid

       ã€€ã€€å›½äº§ç²¾å“è¿žæŽ¥æ± ,淘宝温少诚意出品,带强大的监控功能哦

       ã€€ã€€druid : 直接书写 Java 代码

       ã€€ã€€import com.alibaba.druid.pool.DruidDataSource;

       ã€€ã€€...

       ã€€ã€€DruidDataSource dds = new DruidDataSource();

       ã€€ã€€dds.setDriverClassName("org.postgresql.Driver");

       ã€€ã€€dds.setUrl("jdbc:postgresql://localhost:/mydatabase");

       ã€€ã€€dds.setUsername("enzozhong");

       ã€€ã€€dds.setPassword("");

       ã€€ã€€...

       ã€€ã€€dds.close(); // 关闭池内所有连接

       ã€€ã€€druid : 通过 Nutz.Ioc 的 JSON 配置文件

       ã€€ã€€{

       ã€€ã€€dataSource : {

       ã€€ã€€type : "com.alibaba.druid.pool.DruidDataSource",

       ã€€ã€€events : {

       ã€€ã€€depose : 'close'

       ã€€ã€€},

       ã€€ã€€fields : {

       ã€€ã€€driverClassName : "org.postgresql.Driver",

       ã€€ã€€url : "jdbc:postgresql://localhost:/mydatabase",

       ã€€ã€€username : "enzozhong",

       ã€€ã€€password : ""

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€druid: 通过 Nutz.Ioc 的 XML 配置文件

       ã€€ã€€<ioc xsi:noNamespaceSchemaLocation="nutz-ioc-0.1.xsd">

       ã€€ã€€<obj name="dataSource" type="com.alibaba.druid.pool.DruidDataSource">

       ã€€ã€€<events>

       ã€€ã€€<depose>close</depose>

       ã€€ã€€</events>

       ã€€ã€€<field name="driverClassName"><str>org.postgresql.Driver</str></field>

       ã€€ã€€<field name="url"><str>jdbc:postgresql://localhost:/mydatabase</str></field>

       ã€€ã€€<field name="username"><str>enzozhong</str></field>

       ã€€ã€€<field name="password"><str></str></field>

       ã€€ã€€</obj>

       ã€€ã€€</ioc>

       ã€€ã€€æ³¨å†Œäº† depose 事件,当整个 Ioc 容器注销时,将 真正 关闭所有池内连接

       ã€€ã€€æ›´å¤šé…ç½®

       ã€€ã€€Apache Tomcat 7 连接池

       ã€€ã€€è¿™é‡Œä½¿ç”¨çš„是tomcat7新的自带连接,但是,请把其2个jar移到项目的lib中!!

       ã€€ã€€ç›´æŽ¥ä¹¦å†™ Java 代码

       ã€€ã€€import org.apache.tomcat.jdbc.pool.DataSource;

       ã€€ã€€...

       ã€€ã€€DataSource ds = new DataSource();

       ã€€ã€€ds.setDriverClassName("org.postgresql.Driver");

       ã€€ã€€ds.setUrl("jdbc:postgresql://localhost:/mydatabase");

       ã€€ã€€ds.setUsername("demo");

       ã€€ã€€ds.setPassword("");

       ã€€ã€€...

       ã€€ã€€ds.close(); // 关闭池内所有连接

       ã€€ã€€é€šè¿‡ Nutz.Ioc 的 JSON 配置文件

       ã€€ã€€{

       ã€€ã€€dataSource : {

       ã€€ã€€type : "org.apache.tomcat.jdbc.pool.DataSource",

       ã€€ã€€events : {

       ã€€ã€€depose : 'close'

       ã€€ã€€},

       ã€€ã€€fields : {

       ã€€ã€€driverClassName : 'org.postgresql.Driver',

       ã€€ã€€url : 'jdbc:postgresql://localhost:/mydatabase',

       ã€€ã€€username : 'demo',

       ã€€ã€€password : ''

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€é€šè¿‡ Nutz.Ioc 的 XML 配置文件

       ã€€ã€€<ioc xsi:noNamespaceSchemaLocation="nutz-ioc-0.1.xsd">

       ã€€ã€€<obj name="dataSource" type="org.apache.tomcat.jdbc.pool.DataSource">

       ã€€ã€€<events>

       ã€€ã€€<depose>close</depose>

       ã€€ã€€</events>

       ã€€ã€€<field name="driverClassName"><str>org.postgresql.Driver</str></field>

       ã€€ã€€<field name="url"><str>jdbc:postgresql://localhost:/mydatabase</str></field>

       ã€€ã€€<field name="username"><str>demo</str></field>

       ã€€ã€€<field name="password"><str></str></field>

       ã€€ã€€</obj>

       ã€€ã€€</ioc>

       ã€€ã€€æ³¨å†Œäº† depose 事件,当整个 Ioc 容器注销时,将 真正 关闭所有池内连接

       ã€€ã€€å…³äºŽ depose 事件,更多详情请参看 事件监听

       ã€€ã€€Apache DBCP

       ã€€ã€€dbcp: 直接书写 Java 代码

       ã€€ã€€import org.apache.commons.dbcp.BasicDataSource;

       ã€€ã€€...

       ã€€ã€€BasicDataSource ds = new BasicDataSource();

       ã€€ã€€ds.setDriverClassName("org.postgresql.Driver");

       ã€€ã€€ds.setUrl("jdbc:postgresql://localhost:/mydatabase");

       ã€€ã€€ds.setUsername("demo");

       ã€€ã€€ds.setPassword("");

       ã€€ã€€...

       ã€€ã€€ds.close(); // 关闭池内所有连接

       ã€€ã€€dbcp: 通过 Nutz.Ioc 的 JSON 配置文件

       ã€€ã€€{

       ã€€ã€€dataSource : {

       ã€€ã€€type : "org.apache.commons.dbcp.BasicDataSource",

       ã€€ã€€events : {

       ã€€ã€€depose : 'close'

       ã€€ã€€},

       ã€€ã€€fields : {

       ã€€ã€€driverClassName : 'org.postgresql.Driver',

       ã€€ã€€url : 'jdbc:postgresql://localhost:/mydatabase',

       ã€€ã€€username : 'demo',

       ã€€ã€€password : ''

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€dbcp: 通过 Nutz.Ioc 的 XML 配置文件

       ã€€ã€€<ioc xsi:noNamespaceSchemaLocation="nutz-ioc-0.1.xsd">

       ã€€ã€€<obj name="dataSource" type="org.apache.commons.dbcp.BasicDataSource">

       ã€€ã€€<events>

       ã€€ã€€<depose>close</depose>

       ã€€ã€€</events>

       ã€€ã€€<field name="driverClassName"><str>org.postgresql.Driver</str></field>

       ã€€ã€€<field name="url"><str>jdbc:postgresql://localhost:/mydatabase</str></field>

       ã€€ã€€<field name="username"><str>demo</str></field>

       ã€€ã€€<field name="password"><str></str></field>

       ã€€ã€€</obj>

       ã€€ã€€</ioc>

用DriverManager和DataSource获得Connection的区别在哪

       ã€€ã€€åœ¨JDBC2.0或JDBC3.0中,所有的数据库驱动程序提供商必须提供一个实现了DataSource接口的类,要使用数据源必须首先在JNDI中注册该数据源对象。

        如果在JNDI中注册了数据源对象,将会比起使用DriverManager来具有两个方面的优势:

        首先,程序不需要像使用DriverManager一样对加载的数据库驱动程序信息进行硬编码,程序员可以选择先在JNDI中注册这个数据源对象,然后在 程序中使用一个逻辑名称来引用它,JNDI会自动根据你给出的名称找到与这个名称绑定的DataSource对象。然后就可以使用这个 DataSource对象来建立和具体数据库的连接了。

        其次,使用实现了DataSource接口的类所具有的第二个优势体现在连接池和分布式事务上。连接池通过对连接的复用而不是新建一个物理连接来显著地提高程序的效率。从而适用于任务繁忙、负担繁重的企业级分布式事务。

       ã€€ã€€æ•°æ®åº“连接池的基本原理

        传统的数据库连接方式(指通过DriverManager和基本实现DataSource进行连接)中,一个数据库连接对象均对应一个物理数据库连接,数 据库连接的建立以及关闭对系统而言是耗费系统资源的操作,在多层结构的应用程序环境中这种耗费资源的动作对系统的性能影响尤为明显。

        在多层结构的应用程序中通过连接池(connection pooling)技术可以使系统的性能明显得到提到,连接池意味着当应用程序需要调用一个数据库连接的时,数据库相关的接口通过返回一个通过重用数据库连 接来代替重新创建一个数据库连接。通过这种方式,应用程序可以减少对数据库连接操作,尤其在多层环境中多个客户端可以通过共享少量的物理数据库连接来满足 系统需求。通过连接池技术Java应用程序不仅可以提高系统性能同时也为系统提高了可测量性。

        数据库连接池是运行在后台的而且应用程序的编码没有任何的影响。此中状况存在的前提是应用程序必须通过DataSource对象(一个实现 javax.sql.DataSource接口的实例)的方式代替原有通过DriverManager类来获得数据库连接的方式。一个实现 javax.sql.DataSource接口的类可以支持也可以不支持数据库连接池,但是两者获得数据库连接的代码基本是相同的。

        一个DataSource对象通常注册在JNDI命名服务上,应用程序可以通过标准的方式获得到注册在JNDI服务上的DataSource对象。 代码如下:

       Context ctx = new InitialContext();

       DataSource ds = (DataSource) ctx.lookup("jdbc/openbase");

       ã€€ã€€å¦‚果当前DataSource不支持数据库连接池,应用程序将获得一个和物理数据库连接对应的Connection对象。而如果当前的 DataSource对象支持数据库连接池,应用程序自动获得重用的数据库连接而不用创建新的数据库连接。重用的数据库连接和新建立连接的数据库连接使用 上没有任何不同。应用程序可以通过重用的连接正常的访问数据库,进行访问数据的操作,完成操作后应显式的调用close()关闭数据库连接。

       ã€€ã€€Connection con = ds.getConnection("User", "Pwd");

       ã€€ã€€ç›¸å…³æ•°æ®åº“的操作;

       ã€€ã€€con.close();

       ã€€ã€€å½“关闭数据连接后,当前使用的数据库连接将不会被物理关闭,而是放回到数据库连接池中进行重用。

       ã€€ã€€JDBC3.0规范中数据库连接池框架

       ã€€ã€€JDBC3.0规范中通过提供了一个支持数据库连接池的框架,这个框架仅仅规定了如何支持连接池的实现,而连接池的具体实现JDBC 3.0规范并没有做相关的规定。通过这个框架可以让不同角色的开发人员共同实现数据库连接池。

       ã€€ã€€é€šè¿‡JDBC3.0规范可以知道具体数据库连接池的实现可以分为JDBC Driver级和Application Server级。在JDBC Driver级的实现中任何相关的工作均由特定数据库厂商的JDBC Drvier的开发人员来具体实现,即JDBC Driver既需要提供对数据库连接池的支持同时也必须对数据库连接池进行具体实现。而在Application Server级中数据库连接池的实现中特定数据库厂商的JDBC Driver开发人员和Application Server开发人员来共同实现数据库连接池的实现(但是现在大多数Application Server厂商实现的连接池的机制和规范中提到有差异),其中特定数据库厂商的JDBC Driver提供数据库连接池的支持而特定的Application Server厂商提供数据库连接池的具体实现。

       ã€€ã€€JDBC3.0规范规定了如下的类和接口来支持数据库连接池的实现。

       ã€€ã€€javax.sql.ConnectionEvent

       ã€€ã€€javax.sql.ConnectionPoolDataSource

       ã€€ã€€javax.sql.PooledConnection

       ã€€ã€€javax.sql.ConnectionEventListener

       ã€€ã€€å…¶ä¸­é™¤javax.sql.ConnectionEvent是类,其它的均为接口。

       ã€€ã€€C:/1.jpg

       ã€€ã€€screen.width-)this.width=screen.width-;" src="/Develop/ArticleImages///CSDN_Dev_Image_-7-.jpg">

       ã€€ã€€JDBC3.0连接池框架的关系图

       ã€€ã€€é€šè¿‡æ­¤å›¾å¯ä»¥å¤§æ¦‚的了解相关接口在一个典型的三层环境中应用程序的位置。

       ã€€ã€€æ•°æ®åº“连接池实现层次中,由特定数据库厂商的JDBC Driver开发人员提供连接池支持,而特定Application Server提供连接池实现的情况比较复杂,其它的实现层次均可视为其简化情况的一种。下面将针对这种情况进行说明。

       ã€€ã€€åœ¨è¿™ä¸ªæ¡†æž¶ä¸»è¦æœ‰ä¸¤ä¸ªç”¨æˆ·è§’色存在,它们分别是:

       ã€€ã€€ç‰¹å®šæ•°æ®åº“厂商的JDBC Driver开发人员,之后将简称为Driver Vendor

       ã€€ã€€ç‰¹å®šApplication Server中连接池开发人员,之后将简称为Pooling Vendor

       ã€€ã€€C:/2.bmp

       ã€€ã€€screen.width-)this.width=screen.width-;" src="/Develop/ArticleImages///CSDN_Dev_Image_-7-.gif">

       ã€€ã€€JDBC3.0规范中在上述情况下各个接口和类之间的UML图

       ã€€ã€€ä¸‹é¢å¯¹å‡ ä¸ªå…³é”®æ¨¡å—进行详细的说明:

       ã€€ã€€Driver Vendor DataSource:

       ã€€ã€€Driver Vendor必须提供一个ConnectionPoolDataSource 接口的具体实现,通过这个接口Pooling Vendor可以得到一个PooledConnection对象,从而使第三方实现的连接池可以使用特定数据库厂商得到JDBC Driver产生的数据库连接。在这里ConnectionPoolDataSource接口扮演的角色可以视为产生PooledConnection 对象的工厂。

       ã€€ã€€Driver Vendor PooledConnection:

       ã€€ã€€Driver Vendor必须提供标准PooledConnection 接口实现的类,这个接口允许Pooling Vendor在JDBC Driver提供连接池支持的基础上实现连接池。一个具体PooledConnection对象代表了一个物理的数据库连接;由 PooledConnection对象创建Connection对象仅仅只是一个指向PooledConnetion对象的句柄。在JDBC 3.0连接池实现框架中PooledConnection对象扮演的角色可以视为产生Connection对象的工厂。

       ã€€ã€€Pooling Vendor DataSource:

       Pooling Vendor必须实现DataSource接口,这个接口是和连接池实现模块进行交互的入口点。ConnectionPoolDataSource根据需要创建PooledConnection对象。

       ã€€ã€€Pooling Vendor Connection Cache:

       ã€€ã€€æ­¤æ¨¡å—是Pooling Vendor对连接池的具体实现。JDBC 3.0 规范没有规定在DataSource对象和数据库连接池实现之间的需要实现的接口,所以它们之间的交互由Pooling Vendor自己定义。一般而言,一个数据库连接池的具体实现包含了一个或若干个具体的类,但是在连接池实现模块中必须包含一个类实现标准 ConnectionEventListener接口。当一个PooledConnectiond对象被关闭或者出现异常的时 候,PooledConnection对象将会向ConnectionEventListener接口发送ConnectionEvent对象,连接池实 现模块将会根据返回的ConnectionEvent对象对PooledConnection进行关闭或者重用操作。

       ã€€ã€€ConnectionEvent:

       ã€€ã€€å®žçŽ°è¿žæŽ¥æ± æ—¶ï¼Œå½“应用程序调用Connection.close()试图去关闭数据库连接时,这时需要有一个通告给连接池实现模块,通告对当前的数据 库物理连接(PooledConnection 对象)进行重用。为了使连接池实现模块能得到这种"通告",连接池实现模块必须实现ConnectionEventListener接口,而且同时需要注 册成为PooledConnection对象的监听者。连接池实现模块通过 PooledConnection.addConnectionEventListener()方法注册自己成为一个监听者。

       ã€€ã€€åœ¨å…¸åž‹ä¸‰å±‚环境中具体调用流程:

       ã€€ã€€å½“应用程序通过调用DataSource.getConnection()得到一个数据库连接。

       Pooling Vendor实现的DataSource对象在连接池中进行查找看当前是否有有效的PooledConnection对象,如果连接池中有可用的PooledConnection,则进行检查,如果当前的PooledConnection可用则使用。

       ã€€ã€€å¦‚果如果连接池中没有可用的PooledConnection对象,或者当前的PooledConnection对象不正确,那么Pooling Vendor调用ConnectionPoolDataSource.getPooledConnection类创建一个新的 PooledConnection对象,这时由Driver Vendor实现的ConnectionPoolDataSource将会创建一个满足要求新的PooledConnection对象,并将其返回给连接 池实现模块进行管理。

       ã€€ã€€ç„¶åŽï¼ŒPooling Vendor会调用PooledConnection.getConnection()获得一个逻辑的Connection对象,这个逻辑的 Connection对象将会象正常的Connection对象返回给应用程序。这个逻辑Connection对象实际上是连接池中 PooledConnection对象的一个句柄,当连接池有效时,应用程序调用DataSource.getConnection()就会得到这个句 柄。简而言之,应用程序此时使用的Connection对象仅仅是其创建者PooledConnection对象的句柄而已。

       ã€€ã€€è¿žæŽ¥æ± å®žçŽ°æ¨¡å—调用PooledConnection.addConnectionEventListener()将自己注册成为一个PooledConnection对象的监听者,当数据库连接需要重用或者关闭的时候连接池实现模块可以得到通告。

       ã€€ã€€å½“应用程序通过调用Connection.close()来关闭数据库连接,这时一个ConnectionEvent对象被创建并被返回到连接池实现 模块,连接池实现模块接受到此通告后,将PooledConnection对象返回到池中进行重用。这些过程中其它角色都不能访问 PooledConnection.close()方法,能访问这个方法的只有Pooling Vendor,它们使用这个方法对连接池中的对象进行操作,通过PooledConnection.close()方法可以关闭物理数据库连接。