`
dyccsxg
  • 浏览: 204752 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类

apache commons dbcp 学习与使用

    博客分类:
  • Java
阅读更多

类结构

org

  |_demo

        |_dao

             |_datasource

                        |_ConnectionTools.java

                        |_DataSourceFactory.java

                        |_PropertyDataSourceFactory.java

 

package org.demo.dao.datasource;

import javax.sql.DataSource;

/**
 * 数据源工厂
 * @author  
 * @date    2010-6-18
 * @file    org.demo.dao.datasource.DataSourceFactory.java
 */
public interface DataSourceFactory {
	// 默认数据源名称
	String defaultDataSourceName = "default";
	/**
	 * 返回默认数据源
	 * @return  dataSource or null
	 */
	DataSource getDataSource();
	/**
	 * 返回指定数据源
	 * @return  dataSource or null 
	 */
	DataSource getDataSource(String dataSourceName);
}

 

package org.demo.dao.datasource;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

/**
 * 基于属性文件的数据源工厂
 * @author  
 * @date    2010-6-18
 * @file    org.demo.dao.datasource.PropertyDataSourceFactory.java
 */
public class PropertyDataSourceFactory implements DataSourceFactory{
	// properties
	private static final String defaultFileName = "datasource.properties";
	protected Map<String,Properties> datasourceParams = new HashMap<String,Properties>();
	protected Map<String,DataSource> datasourceMap = new HashMap<String,DataSource>();
	/**
	 * 构造函数
	 * @throws  RuntimeException
	 *          If the datasource.properties could not be found or property key is illegal.
	 * @throws  IOException
	 *          If could not load properties from datasource.properties
	 */
	public PropertyDataSourceFactory()throws IOException{
		this(defaultFileName);
	}
	/**
	 * 构造函数
	 * @param fileName 
	 * 		  The resource name
	 * @throws  RuntimeException
	 *          If the resource could not be found or property key is illegal.
	 * @throws  IOException
	 *          If could not load properties from resource
	 */
	public PropertyDataSourceFactory(String fileName)throws IOException{
		// getResourceAsStream
		InputStream in = PropertyDataSourceFactory.class.getClassLoader()
						 .getResourceAsStream(fileName);
		if(in == null){
			throw new RuntimeException("The [" + fileName + "] is not found.");
		}
		// load properties from stream
		Properties props = new Properties();
		try {
			props.load(in);
		} catch (IOException e){
			throw new IOException("Could not load [" + fileName + "] config file.",e);
		}
		// analyze properties
		Iterator<Object> it = props.keySet().iterator();
		while(it.hasNext()){
			String key = (String)it.next();
			String value = props.getProperty(key);
			int dotIndex = key.indexOf('.');
			if(dotIndex < 1){
				// dotIndex must > 1 [default.driver=oracle.jdbc.driver.OracleDriver]
				throw new RuntimeException("Illegal property key [" + key + "].");
			}
			String datasourceName = key.substring(0,dotIndex);
			key = key.substring(dotIndex + 1);
			Properties params = datasourceParams.get(datasourceName);
			if(params == null){
				params = new Properties();
				datasourceParams.put(datasourceName, params);
			}
			params.put(key,value);
		}
	}
	/**
	 * 返回默认数据源
	 * @return  dataSource or null
	 */
	public DataSource getDataSource(){
		return getDataSource(defaultDataSourceName);
	}
	/**
	 * 返回指定数据源
	 * @param  dataSourceName
	 *         The dataSource name
	 * @return  dataSource or null
	 */
	public DataSource getDataSource(String dataSourceName){
		DataSource datasource = datasourceMap.get(dataSourceName);
		if(datasource != null){
			return datasource;
		}
		datasource = createDataSource(datasourceParams.get(dataSourceName));
		if(datasource != null){
			datasourceMap.put(dataSourceName, datasource);
		}
		return datasource;
	}
	/**
	 * 创建一个数据源
	 * @param props
	 * @return  dataSource or null
	 * @throws  IllegalArgumentException
	 *          If props is null
	 */
	protected DataSource createDataSource(Properties props){
		if(props == null){
			throw new IllegalArgumentException("props can not be null.");
		}
		if(props.getProperty("jndiName") != null){
			DataSource jndiDataSource = getJndiDataSource(props);
			if(jndiDataSource != null){
				return jndiDataSource;
			}
		}
		BasicDataSource dataSource = new BasicDataSource();
		// required
		dataSource.setDriverClassName(props.getProperty("driverClassName"));
		dataSource.setUrl(props.getProperty("url"));
		dataSource.setUsername(props.getProperty("username",""));
		dataSource.setPassword(props.getProperty("password",""));
		// options
		dataSource.setInitialSize(Integer.parseInt(props.getProperty("initialSize","3")));
		dataSource.setMaxActive(Integer.parseInt(props.getProperty("maxActive", "10")));
		dataSource.setMaxIdle(Integer.parseInt(props.getProperty("maxIdle","5")));
		dataSource.setMaxWait(Long.parseLong(props.getProperty("maxWait","-1")));
		dataSource.setValidationQuery(props.getProperty("validationQuery"));
		return dataSource;
	}
	/**
	 * 返回 jndi 数据源
	 * @param  props
	 * @return  dataSource or null
	 */
	protected DataSource getJndiDataSource(Properties props){
		String jndiName = props.getProperty("jndiName");
		String inContainer = props.getProperty("inContainer");
		String prefix = "java:comp/env/";
		if(!jndiName.startsWith(prefix) && "true".equals(inContainer)){
			jndiName = prefix + jndiName;
		}
		// 
		DataSource jndiDataSource = null;
		Context context = null;
		try{
			context = new InitialContext(props);
			jndiDataSource = (DataSource)context.lookup(jndiName);
			if(jndiDataSource != null){
				return jndiDataSource;
			}
		} catch (NamingException e){
			// ignore
		} finally {
			try{
				if(context != null){
					context.close();
				}
			} catch (NamingException e){
				// ignore
			}
		}
		return jndiDataSource;
	}
}

 

package org.demo.dao.datasource;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

/**
 * 连接工具
 * @author  
 * @date    2010-6-18
 * @file    org.demo.dao.datasource.ConnectionTools.java
 */
public abstract class ConnectionTools {
	// 数据源工厂
	protected static DataSourceFactory _factory;
	static {
		try {
			_factory = new PropertyDataSourceFactory();
		} catch(IOException e){
			e.printStackTrace();
		}
	}
	/**
	 * 返回默认数据源的连接
	 * @return  connection or null
	 */
	public static Connection getConnection(){
		return getConnection(DataSourceFactory.defaultDataSourceName);
	}
	/**
	 * 返回指定数据源的连接
	 * @param dataSourceName
	 *        The dataSource name
	 * @return  connection or null
	 */
	public static Connection getConnection(String dataSourceName){
		DataSource datasource = _factory.getDataSource(dataSourceName);
		Connection conn = null;
		if(datasource != null){
			try{
				conn = datasource.getConnection();
			} catch (SQLException e){
				e.printStackTrace();
			}
		}
		return conn;
	}
	/**
	 * 关闭连接对象
	 * @param rset
	 * 		  ResultSet
	 * @param stmt
	 *        Statement
	 * @param conn
	 *        Connection
	 */
	public static void close(ResultSet rset,Statement stmt,Connection conn){
		try { if (rset != null) rset.close(); } catch (Exception e) {}
		try { if (stmt != null) stmt.close(); } catch (Exception e) {}
		try { if (conn != null) conn.close(); } catch (Exception e) {}
	}
}

 

# datasource.properties
# oracle
default.driverClassName=oracle.jdbc.driver.OracleDriver
default.url=jdbc:oracle:thin:@localhost:1521:test
default.username=scott
default.password=tiger
# 

 

package org.demo.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import org.demo.dao.datasource.ConnectionTools;
// 
// library dependencies:
//  * commons-dbcp-1.3.jar   [http://commons.apache.org/dbcp/download_dbcp.cgi]
//  * commons-pool-1.5.4.jar [http://commons.apache.org/pool/download_pool.cgi]
// 
/**
 * @author  
 * @date    2010-6-18
 * @file    org.demo.dao.Main.java
 */
public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws Exception{
		// get connection
		Connection conn = ConnectionTools.getConnection();
		// execute business operations
		Statement stmt = null;
		ResultSet rset = null;
		stmt = conn.createStatement();
		rset = stmt.executeQuery("select 1 from dual");
		int cols = rset.getMetaData().getColumnCount();
		while(rset.next()){
			for(int i=1;i<=cols;i++){
				System.out.print("\t" + rset.getObject(i));
			}
			System.out.println("");
		}
		// close connection
		ConnectionTools.close(rset, stmt, conn);
	}

}

  

分享到:
评论

相关推荐

    apache commons dbcp api_zh

    apache commons dbcp api_zh

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方案

    3. **commons-pool.jar**:Apache Commons Pool是对象池化的实现,DBCP使用这个库来管理数据库连接的生命周期,确保连接的有效利用和回收。 加载这些库到工程的方式因开发环境而异,以下是一些常见方法: - **IDE...

    org.apache.commons.dbcp.BasicDataSource的解决方法

    Apache Commons DBCP(Database Connection Pool)是Java中一个广泛使用的数据库连接池库,它提供了数据源(DataSource)实现,帮助应用高效管理数据库连接。在处理`org.apache.commons.dbcp.BasicDataSource`时,...

    Apache Commons DBCP 软件实现数据库连接池

    总之,Apache Commons DBCP是Java应用中实现高效数据库连接管理的重要工具,通过合理配置和使用,能够显著提升系统的运行效率和资源利用率。开发者应当熟练掌握其使用方法和特性,以便在实际项目中得心应手。

    commons中的DBCP连接池jar

    Apache Commons DBCP(Database Connection Pool)是Java开发中常用的一个数据库连接池组件,它属于Apache Commons项目的一部分。DBCP提供了数据库连接池的功能,能够有效地管理和复用数据库连接,提高应用性能并...

    commons-dbcp-1.4.jar依赖包

    6. **与其他连接池的比较**:简述DBCP与C3P0、HikariCP、Druid等其他流行的Java数据库连接池的差异和选择依据。 7. **最佳实践**:提供在实际项目中使用DBCP的最佳实践,包括如何处理并发问题,以及在不同场景下...

    commons-dbcp.jar.rar

    Apache Commons DBCP与MySQL数据库配合使用时,需要确保JDBC驱动也已添加到项目中。同时,DBCP支持其他类型的数据库,只需更换相应的JDBC驱动并调整连接URL即可。 总的来说,Apache Commons DBCP以其简洁的API、...

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource

    在这个特定的错误中,我们看到的是`org.apache.commons.dbcp.BasicDataSource`,这是Apache Commons DBCP库中的一个类,用于管理数据库连接池。这个异常通常意味着在应用的类路径(ClassPath)中没有包含DBCP的jar...

    commons-pool commons-dbcp

    Apache Commons DBCP(数据库连接池)和Apache Commons Pool是两个在Java开发中广泛使用的开源库,主要用于管理和优化数据库连接的使用。这两个组件是高效、可靠的数据库操作背后的关键技术。 Apache Commons Pool...

    COMMONS DBCP的使用与配置

    总之,Apache Commons DBCP是一个强大的数据库连接池组件,通过合理配置和使用,能显著提升Java应用程序的数据库访问性能。在实际项目中,可以根据具体需求选择集成到Spring、iBatis或Hibernate等框架中,实现更高效...

    commons-dbcp:Apache Commons DBCP的镜像

    与Apache Commons DBCP的使用有关的问题应张贴到。 在哪里可以获得最新版本? 您可以从我们的下载源代码和二进制文件。 或者,您可以从中央Maven存储库中提取它: &lt; groupId&gt;org.apache.commons &lt; artifactId&gt;...

    commons-dbcp jar包

    标题"commons-dbcp jar包"指的是Apache Commons DBCP库的Java归档(JAR)文件。这个库是Spring框架在进行数据库连接管理时的一个常用组件,尤其是在开发基于Java的企业级应用时。"spring开发的必备jar包"表明了在...

    commons-dbcp-1.4-bin

    Apache Commons DBCP (Database Connection Pool) 是一个用于管理数据库连接池的开源组件,它基于Apache Commons Pool库。这个组件的主要目标是为Java应用程序提供高效、可配置的数据库连接池服务,以优化数据库资源...

    org.apache.commons.dbcp.BasicDataSource资源保下载

    总的来说,Apache Commons DBCP是Java开发中一个强大的数据库连接池工具,通过`BasicDataSource`类,开发者可以高效地管理和使用数据库连接,提高应用程序的性能。了解并掌握其工作原理和配置方式,对于优化Java应用...

    commons-dbcp包资源

    在实际应用中,Apache Commons DBCP常与Spring框架结合使用,通过Spring的DataSource接口进行数据源管理,简化了数据库连接池的配置和管理。 总之,Apache Commons DBCP是一个强大且灵活的数据库连接池解决方案,...

    commons dbcp源码及API

    Apache Jakarta Commons DBCP supports JDK 1.3 (JDBC 2.0) and JDK 1.4-1.5 (JDBC 3.0). JDK 1.6 (JDBC 4.0)

    commons-dbcp

    总之,Apache Commons DBCP是Java开发中常用的数据连接池解决方案,通过与其他Apache Commons库和流行框架如Spring和Hibernate的集成,为开发者提供了高效、灵活的数据库连接管理能力。理解和熟练使用这些库可以极大...

    Struts的java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource异常的解决方法

    然而,对于初学者来说,遇到错误是常有的事,比如“java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource”。这个异常表明在运行时,系统无法找到指定的类,即Apache Commons DBCP的...

    commons-dbcp (1.2-1.4) 4个jar包

    同时,DBCP可以与其他Apache Commons库(如Commons Pool)配合使用,以提供更全面的数据管理服务。 总的来说,Apache Commons DBCP是一个强大而灵活的数据库连接池解决方案,广泛应用于各种Java应用程序,尤其是...

Global site tag (gtag.js) - Google Analytics