1.cloud-init介绍及源码解读(上)
2.å¦ä½å建 DataSource
3.ç¨DriverManageråDataSourceè·å¾Connectionçåºå«å¨åª
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、c 源码格式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、wpf 源码程序ConfigDrive、OpenNebula等。通过Virtual-Router获取metadata和userdata信息。 cloud-init在云主机上创建目录结构以记录信息。cloud.cfg文件定义各阶段任务。 cloud-init工作原理 cloud-init通过从datasource获取metadata,执行四个阶段任务完成定制化工作。在systemd环境下,recyclerview 源码分析这些阶段对应的服务在启动时执行一次。 local阶段从config drive中获取配置信息写入网络接口文件。network阶段完成磁盘格式化、分区、挂载等。config阶段执行配置任务。final阶段系统初始化完成,运行自动化工具如puppet、jfinal propkit源码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()æ¹æ³å¯ä»¥å ³éç©çæ°æ®åºè¿æ¥ã