1.cloud-init介绍及源码解读(上)
2.å¦ä½å建 DataSource
3.ç¨DriverManageråDataSourceè·å¾Connectionçåºå«å¨åª
cloud-init介绍及源码解读(上)
cloud-init介绍及源码解读(上) cloud-init的接口基本概念 metadata包含服务器信息,如instance id,源码源码display name等。接口userdata包含文件、源码源码脚本、接口yaml文件等,源码源码autojs源码有红线用于系统配置和软件环境配置。接口datasource是源码源码cloud-init配置数据来源,支持AWS、接口Azure、源码源码OpenStack等,接口定义统一抽象类接口,源码源码所有实现都要遵循规范。接口 模块决定定制化工作,源码源码metadata决定结果。接口cloud-init配置有4个阶段:local、network、golang源码编译过程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环境下,在线工具源码php这些阶段对应的服务在启动时执行一次。 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()æ¹æ³å¯ä»¥å ³éç©çæ°æ®åºè¿æ¥ã
2024-11-27 20:281033人浏览
2024-11-27 19:48735人浏览
2024-11-27 18:53647人浏览
2024-11-27 18:251472人浏览
2024-11-27 18:191421人浏览
2024-11-27 17:57819人浏览
1.微信换头像加红旗小程序实现原理及源码微信换头像加红旗小程序实现原理及源码 每年的国庆节,微信小程序换头像功能都会迎来流量高峰,用户热衷于换上带有节日特色的头像。其实,实现这一功能的原理并不复杂
據也門胡塞武裝1月12日證實,也門薩那、荷台達、薩達、扎馬爾等地遭美軍和英軍空襲,其中包括薩那北部、薩那國際機場附近的代拉米空軍基地;荷台達市南部的宰比德地區;荷台達市南部的荷台達機場;薩達市東部的卡
中国消费者报济南讯记者尹训银)为进一步营造反对浪费的社会风气,有效遏止茶叶产品包装过度奢华、铺张浪费的现象,近日,山东省济南市消费者协会向广大茶叶经营者与消费者发布“倡导茶叶适度包装,推动绿色文明消费