1.basicdatasourceådrivermanagerdatasourceçåºå«
2.springbasicdatasourceådatasourceçåºå«
3.å¦ä½å建 DataSource
4.源码详解系列(四) ------ DBCP2的使用和分析(包括JNDI和JTA支持)已停更
basicdatasourceådrivermanagerdatasourceçåºå«
ãã DriverManagerä¼ ç»çjdbcè¿æ¥ï¼éè¿Class.forName("XXX"),çåæ³æ³¨åä¹åï¼å°±å¯ä»¥DriverManager.getConnection()è·å¾è¿æ¥äºã
DataSourceæ¯å»ºç«å¨JNDIæå¡åºç¡ä¸ç,éè¦application serveré ç½®datasource.é¦å éè¦æ³¨åä¸ä¸ªDataSource(ä¸è¬å¨/META-INF/context.xmlä¸)ç¶åå¨ web.xmlæ件ä¸å¼ç¨è¿ä¸ªDataSource,å°±å¯ä»¥DataSource.getConnection()è·å¾è¿æ¥,å ·ä½æä½åè(tomcat ç®å½éçJNDI Resourceså°è) ã
springbasicdatasourceådatasourceçåºå«
é ç½®ä¸ä¸ªæ°æ®æº Springå¨ç¬¬ä¸æ¹ä¾èµå ä¸å å«äºä¸¤ä¸ªæ°æ®æºçå®ç°ç±»å ï¼å ¶ä¸æ¯ApacheçDBCPï¼å ¶äºæ¯ C3P0ãå¯ä»¥å¨Springé ç½®æ件ä¸å©ç¨è¿ä¸¤è ä¸ä»»ä½ä¸ä¸ªé ç½®æ°æ®æº
å¦ä½å建 DataSource
ä½ å¥½ï¼å¯ä»¥åè§ä¸é¢ï¼
æ°æ®æºæ¯æ°æ®åºè¿æ¥æ± éé¢çæ¦å¿µï¼è¿æ¥æ± å°±æ¯æå½æå¡å¨å¯å¨æ¶ï¼å 建ç«å 个è¿æ¥ï¼å¨åºç¨éè¦ä¸æ°æ®åºè¿æ¥æ¶ï¼å°±ä»è¿æ¥æ± éè·åï¼ä½¿ç¨å®ä»¥åï¼ä¸æ¯å°è¿æ¥ææï¼èæ¯æ¾åå°æ± éé¢ï¼è¿æ ·å°±åå°äºæ°æ®è¿æ¥å建ç次æ°ï¼å¤§å¤§æé«äºè¿æ¥æ§è½ãèæ°æ®æºå°±æ¯ç»æå¡å¨ä¸ä¸ªé 置信æ¯ï¼ç¶æå¡å¨å°±ç¥éæä¹ä½¿ç¨JDBC驱å¨ï¼æ¯å¦urlåæ°ï¼æ°æ®åºå®ä¾åãç¨æ·åä¸å¯ç ççãJavaä¸çæ°æ®æºå°±æ¯javax.sql.DataSourceãDataSourceçå建å¯ä»¥æä¸åçå®ç°ï¼ä¸é¢ä»¥mysql为ä¾ä»ç»å ç§å¸¸è§DataSourceçå建æ¹æ³ï¼
ä¸ãJNDIæ¹å¼å建DataSource
以JNDIæ¹å¼å建æ°æ®æºé¦å è¦é ç½®æ°æ®æºçç¸å ³è¿æ¥ä¿¡æ¯ï¼ä¹å°±æ¯æ°æ®æºè¿æ¥æ± ã该é ç½®åºè¯¥å¨Tomcatå®è£ ç®å½ä¸çconf/context.xmlæ件ä¸é ç½®ï¼å¨EclipseçJ2EEæ¶æä¸ï¼ä¹å¯ä»¥æcontext.xmlæ件å建å¨/META-INFç®å½ä¸ãå ¶é ç½®å¦ä¸ï¼
<Context><!--MySql-->
<Resource name="jdbc/movie" auth="Container" type="javax.sql.DataSource"
maxActive="" maxIdle="" maxWait=""
username="[ç¨æ·å]" password="[å¯ç ]" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:/[å®ä¾å]?autoReconnect=true"/>
</Context>
æ£ç¡®çé ç½®åï¼å°±å¯ä»¥å¨ç¨åºä¸ä»¥JNDIçæ¹å¼å建æ°æ®æºï¼å¾å°æ°æ®åºè¿æ¥å¹¶è¿è¡ç¸åºçæä½ã代ç å¦ä¸ï¼
try {
Context context = new InitialContext();
if (context == null){
throw new Exception("create context failed!");
}
DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/[å®ä¾å]");
if (ds == null) {
Thread.sleep();
ds = (DataSource) context.lookup("java:comp/env/jdbc/[å®ä¾å]");
if (ds == null) {
throw new Exception("get datasource failed!");
}
}
} catch (NamingException ne) {
throw ne;
} catch (Exception e) {
throw e;
}
äºãApacheæä¾çç®åè¿æ¥æ± å建æ°æ®æº
以è¿ç§æ¹å¼å建æ°æ®æºå¿ é¡»å åå¤ä¸¤ä¸ªjaræ件ï¼commons-dbcp.jar å commons-pool.jarï¼å°è¿ä¸¤ä¸ªjarå æ¾å°WEB-INF/libç®å½ä¸ã以è¿ç§æ¹å¼å建çæ°æ®æºå°±ä¸åæ¯javax.sql.DataSourceäºï¼èæ¯org.apache.commons.dbcp.BasicDataSourceãèä¸ä¸åéè¦é 置任ä½æ件就å¯ä»¥ç´æ¥ä½¿ç¨ã代ç å¦ä¸ï¼
// å建BasicDataSource对象
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:/[å®ä¾å]");
ds.setUsername("[ç¨æ·å]");
ds.setPassword("[å¯ç ]");
ds.setInitialSize();
ds.setMaxActive();
ds.setMaxIdle();
ds.setMaxWait();
// å ³éæ°æ®æºè¿æ¥
ds.close();
ä¸ãC3P0æ¹å¼å建æ°æ®æº
使ç¨C3P0æ¹å¼å建æ°æ®æºåºè¯¥é¦å åå¤ä¸ä¸ªjaræ件ï¼c3p0-0.9.1.2.jarï¼å°å ¶æ¾å°WEB-INF/libç®å½ä¸ï¼å°±å¯ä»¥å¨é¡¹ç®ä¸ä½¿ç¨C3P0å建æ°æ®æºï¼C3P0å建çæ°æ®æºå¯¹è±¡ä¹ä¸æ¯DataSource对象ï¼èæ¯ComboPooledDataSourceï¼ä»£ç å¦ä¸ï¼
// å建ComboPooledDataSource对象
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:/[å®ä¾å]");
ds.setUser("[ç¨æ·å]");
ds.setPassword("[å¯ç ]");
ds.setInitialPoolSize();
ds.setMaxPoolSize();
ds.setMaxIdleTime();
åãProxoolæ¹å¼å建æ°æ®æº
éç¨è¯¥æ¹å¼å建æ°æ®æºéè¦åå¤çjarå ï¼proxool-.9.0RC3.jarï¼å°å ¶æ¾å°WEB-INF/libç®å½ä¸ï¼ä¹åå°±å¯ä»¥é¡¹ç®ä¸å建ProxoolDataSource对象ï¼å ¶ä»£ç å¦ä¸ï¼
// å建ProxoolDataSource对象
ProxoolDataSource ds = new ProxoolDataSource();
ds.setDriver("com.mysql.jdbc.Driver");
ds.setDriverUrl("jdbc:mysql://localhost:/[å®ä¾å]");
ds.setUser("[ç¨æ·å]");
ds.setPassword("[å¯ç ]");
äºãBoneCPæ¹å¼å建æ°æ®æº
BoneCPæ¯ä¸ä¸ªå¿«éé«æï¼å¼æºå è´¹çJavaæ°æ®åºæ¥æ± ãåä½è 称ï¼BoneCPå¨æ§è½ä¸ä¼å®å ¨è¶ è¶ææ主æµçJavaè¿æ¥æ± ãå®å¯ä»¥å¸®ä½ 管çæ°æ®è¿æ¥ï¼è®©ä½ çåºç¨ç¨åºè½æ´å¿«éå°è®¿é®æ°æ®åºãæ¯C3P0/DBCP(DataBaseconnection poolï¼æ°æ®åºè¿æ¥æ± )è¿æ¥æ± å¿«åãè¿ä¸ªæ°æ®åºè¿æ¥æ± éç¨Google Collectionä½ä¸ºå é¨çéåç±»æ¡æ¶ï¼èä¸ç°å¨ççæ¬å·²ç»å¾ç¨³å®ãè¦ä½¿ç¨BoneCPï¼å¿ é¡»ç¨å°çjaræ件æï¼
· bonecp-0.6.5.jar
· google-collections-1.0.jar
· slf4j-api-1.5..jar
· slf4j-log4j-1.5..jar
· log4j-1.2..jar
å°è¿äºjarå æ¾å°WEB-INF/libç®å½ä¸ï¼å°±å¯ä»¥å¨ç¨åºä¸å建BoneCPDataSource对象ï¼ä»£ç å¦ä¸ï¼
// å建BoneCPDataSource对象
BoneCPDataSource ds = new BoneCPDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:/[å®ä¾å]");
ds.setUsername("[ç¨æ·å]");
ds.setPassword("[å¯ç ]");
ds.setAcquireIncrement(1);
ds.setAcquireRetryDelay();
ds.setIdleConnectionTestPeriod();
ds.setMinConnectionsPerPartition(2);
ds.setMaxConnectionsPerPartition();
ds.setPartitionCount(2);
å¨å建å®æ°æ®æºä¹åï¼å°±å¯ä»¥å©ç¨jdbcå¨ç¨åºä¸æ°æ®åºä¹é´å»ºç«è¿æ¥ï¼ä½è¦æ³¨æçæ¯ï¼è¦æç¸å ³çjdbc驱å¨å ï¼ä¸åçæ°æ®åºéè¦ä¸åç驱å¨ï¼ä¸è¬å¨å个æ°æ®åºå®æ¹ç½é½å¯ä»¥è·åã
æé纳ï¼
源码详解系列(四) ------ DBCP2的使用和分析(包括JNDI和JTA支持)已停更
DBCP是一个用于创建和管理数据库连接的工具,通过连接池复用连接以减少资源消耗。它具备连接数控制、连接有效性检测、连接泄露控制和缓存语句等功能。Tomcat内置连接池、红包扫雷源码教学Spring团队推荐使用DBCP,阿里巴巴的druid也是基于DBCP开发的。 DBCP支持通过JNDI获取数据源,并且可以获取JTA或XA事务中的连接对象,用于两阶段提交(2PC)的事务处理。本篇文章将通过例子来解释如何使用DBCP。 以下是文章的详细内容:使用例子需求
本例将展示如何使用DBCP连接池获取连接对象,并进行基本的增删改查操作。工程环境
JDK:1.8.0_
maven:3.6.1
IDE:eclipse 4.
mysql-connector-java:8.0.
mysql:5.7.
DBCP:2.6.0
主要步骤
创建Maven项目,苹果内部获取源码打包方式为war(war也可以是jar,这里选择war是为了测试JNDI功能)。
引入DBCP相关依赖。
在resources目录下创建dbcp.properties文件,配置数据库连接参数及连接池基本参数。
编写JDBCUtils类,实现初始化连接池、有趣的程序源码获取连接、管理事务和资源释放等功能。
创建测试类,实现基本的增删改查操作。
配置文件详解
dbcp.properties文件包含数据库连接参数和连接池基本参数,如数据库URL、用户名、现金网源码出租密码、连接池大小等。其中,数据库URL后面添加了参数以避免乱码和时区问题。建议根据项目需求调整参数设置。基本连接属性
数据库URL
用户名
密码
连接池大小
缓存语句(在MySQL下建议关闭)
连接检查参数(建议开启testWhileIdle,避免性能影响)
事务相关参数(通常使用默认设置)
连接泄漏回收参数
其他参数(较少使用)
源码分析
DBCP主要涉及以下几个类:BasicDataSource:提供基本的asp源码后门检测数据库操作数据源。
BasicManagedDataSource:BasicDataSource的子类,用于创建支持XA事务或JTA事务的连接。
PoolingDataSource:BasicDataSource中实际调用的数据源,用于管理连接。
ManagedDataSource:PoolingDataSource的子类,用于支持XA事务或JTA事务的连接。
使用DBCP连接池创建连接时,首先创建BasicDataSource对象,初始化配置参数。然后从连接池中获取连接。连接获取过程涉及到数据源和连接池的创建,连接对象的包装和回收。通过JNDI获取数据源对象需求
使用JNDI获取DBCP数据源对象,以PerUserPoolDataSource和SharedPoolDataSource为例。为了在tomcat容器中测试,需要配置JNDI上下文。引入依赖
引入JNDI相关的依赖。
编写context.xml文件,配置JNDI上下文。
在web.xml中配置资源引用,将JNDI对象与web应用绑定。
测试结果
打包项目并部署到tomcat上运行,通过访问指定的jsp页面,验证JNDI获取数据源对象的正确性。使用DBCP测试两阶段提交
介绍如何使用DBCP实现JTA事务的两阶段提交(2PC)。使用DBCP的BasicManagedDataSource类支持事务处理。通过测试代码验证了2PC的正确性。 以上内容涵盖了DBCP的使用、配置、源码分析、JNDI集成以及两阶段提交的实现,为开发者提供了全面的参考。