`
chenzehe
  • 浏览: 538127 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

BoneCP源码——从Manual configuration说起

 
阅读更多

BoneCP官网上有其配置的使用文档,看最基本的Manual configuration

 

	Class.forName("org.hsqldb.jdbcDriver"); 	// load the DB driver
 	BoneCPConfig config = new BoneCPConfig();	// create a new configuration object
 	config.setJdbcUrl("jdbc:hsqldb:mem:test");	// set the JDBC url
	config.setUsername("sa");			// set the username
	config.setPassword("");				// set the password
	
	config.setXXXX(...);				// (other config options here)
	
	BoneCP connectionPool = new BoneCP(config); 	// setup the connection pool
	
	Connection connection;
	connection = connectionPool.getConnection(); 	// fetch a connection
	
	...  do something with the connection here ...
	
	connection.close();				// close the connection
	connectionPool.shutdown();			// close the connection pool
 其使用步骤为先加载数据库驱动,然后声明一个配置文件描述类BoneCPConfig,再根据该类实例化一个连接池实例BoneCP,根据该实例的getConnection()方法可得到一个数据库连接对象Connection,可进行数据库操作,最后关闭Connection对象和连接池。

 BoneCPConfig为配置文件类(Configuration class),它在com.jolbox.bonecp包下:

package com.jolbox.bonecp;
/**
 * Configuration class.
 *
 * @author wallacew
 */
public class BoneCPConfig implements BoneCPConfigMBean, Cloneable, Serializable {
      ......
}

 BoneCPConfigMBean为配置接口,MBean interface for config。

 

BoneCP有四个构造函数:

	/**
	 * Default constructor. Attempts to fill settings in this order:
	 * 1. bonecp-default-config.xml file, usually found in the pool jar
	 * 2. bonecp-config.xml file, usually found in your application's classpath
	 * 3. Other hardcoded defaults in BoneCPConfig class.
	 */
	public BoneCPConfig(){
		// try to load the default config file, if available from somewhere in the classpath
		loadProperties("bonecp-default-config.xml");
		// try to override with app specific config, if available
		loadProperties("bonecp-config.xml");
	}
	/** Creates a new config using the given properties.
	 * @param props properties to set.
	 * @throws Exception on error
	 */
	public BoneCPConfig(Properties props) throws Exception {
		this();
		this.setProperties(checkNotNull(props));
	}
	/** Initialize the configuration by loading bonecp-config.xml containing the settings. 
	 * @param sectionName section to load
	 * @throws Exception on parse errors
	 */
	public BoneCPConfig(String sectionName) throws Exception{
		this(BoneCPConfig.class.getResourceAsStream("/bonecp-config.xml"), checkNotNull(sectionName));
	}

	/** Initialise the configuration by loading an XML file containing the settings. 
	 * @param xmlConfigFile file to load
	 * @param sectionName section to load
	 * @throws Exception 
	 */
	public BoneCPConfig(InputStream xmlConfigFile, String sectionName) throws Exception{
		this();
		setXMLProperties(xmlConfigFile, checkNotNull(sectionName));
	}

 上面构造函数提供了基于XML文件和Properties两种配置方式,默认构造函数去加载根目录下的默认配置文件bonecp-default-config.xml,该配置文件随着jar包一起发布,在根目录下:

	/**
	 * Loads the given properties file using the classloader.
	 * @param filename Config filename to load
	 * 
	 */
	protected void loadProperties(String filename) {
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		if (classLoader != null){
			URL url = classLoader.getResource(filename);
			if (url != null){
				try {
					this.setXMLProperties(url.openStream(), null);
				} catch (Exception e) {
					// do nothing
				} 
			}
		}
	}

 对于以XML文件为参数的构造函数,先调用javax.xml包下的类对XML文件解析,然后再把XML文件转换成Properties形式去实例化(调用setProperties(Properties props)方法):

/**
	 * @param xmlConfigFile
	 * @param sectionName
	 * @throws Exception
	 */
	private void setXMLProperties(InputStream xmlConfigFile, String sectionName)
			throws Exception {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db;
		// ugly XML parsing, but this is built-in the JDK.
		try {
			db = dbf.newDocumentBuilder();
			Document doc = db.parse(xmlConfigFile);
			doc.getDocumentElement().normalize();

			// get the default settings
			Properties settings = parseXML(doc, null);
			if (sectionName != null){
				// override with custom settings
				settings.putAll(parseXML(doc, sectionName));
			}
			// set the properties
			setProperties(settings);

		} catch (Exception e) {
			throw e;
		} finally {
			if (xmlConfigFile != null){ // safety
				xmlConfigFile.close();
			}
		}
	}

 对于setProperties(Properties props)方法是把配置文件读取并设置到字段的实现,先用Java返射机会,读出BoneCPConfig类中所有设置属性的方法,以is开头或set开头的方法:

	for (Method method: BoneCPConfig.class.getDeclaredMethods()){
			String tmp = null;
			if (method.getName().startsWith("is")){
				tmp = lowerFirst(method.getName().substring(2));
			} else if (method.getName().startsWith("set")){
				tmp = lowerFirst(method.getName().substring(3));
			} else {
				continue;
			}
                        ......
         }

 然后再根据方法的参数个数和参数类型进行赋值, BoneCPConfig将属性字段类型限制为4种类型:int、long、String、boolean:

if (method.getParameterTypes().length == 1 && method.getParameterTypes()[0].equals(int.class)){
				String val = props.getProperty(tmp);
				if (val == null){
					val = props.getProperty("bonecp."+tmp); // hibernate provider style
				}
				if (val != null) {
					try{
						method.invoke(this, Integer.parseInt(val));
					} catch (NumberFormatException e){
						// do nothing, use the default value
					}
				}
			} else if (method.getParameterTypes().length == 1 && method.getParameterTypes()[0].equals(long.class)){
				String val = props.getProperty(tmp);
				if (val == null){
					val = props.getProperty("bonecp."+tmp); // hibernate provider style
				}
				if (val != null) {
					try{
						method.invoke(this, Long.parseLong(val));
					} catch (NumberFormatException e){
						// do nothing, use the default value
					}
				}
			} else if (method.getParameterTypes().length == 1 && method.getParameterTypes()[0].equals(String.class)){
				String val = props.getProperty(tmp);
				if (val == null){
					val = props.getProperty("bonecp."+tmp); // hibernate provider style
				}
				if (val != null) {
					method.invoke(this, val);
				}
			} if (method.getParameterTypes().length == 1 && method.getParameterTypes()[0].equals(boolean.class)){
				String val = props.getProperty(tmp);
				if (val == null){
					val = props.getProperty("bonecp."+tmp); // hibernate provider style
				}
				if (val != null) {
					method.invoke(this, Boolean.parseBoolean(val));
				}
			}

个人认为这段代码写得不够优雅,至少相同部分可以提取出来,从设计的角度说这里也最好采用工厂方式便于多种实现。

 

分享到:
评论

相关推荐

    BoneCP.zip_BoneCP_BoneCP 源码_jdbc BoneCP_oracle

    总结来说,这个压缩包提供的源码实例展示了如何在Java项目中集成BoneCP连接池,并针对Oracle和MySQL数据库进行配置。通过学习和实践这个例子,开发者可以更好地理解和运用数据库连接池,提升应用的性能和稳定性。

    数据库连接池BoneCP源码分析报告

    BoneCP是一款高效、轻量级的Java数据库连接池实现,它的源码分析对于我们理解数据库连接池的工作原理,优化数据库性能以及进行二次开发具有重要意义。 首先,我们需要了解数据库连接池的基本概念。数据库连接池是...

    数据库连接池BoneCP源码分析报告.doc

    - **连接获取**:当应用程序请求数据库连接时,`BoneCPDataSource.getConnection()` 方法会从连接池中获取一个已建立的连接或者创建一个新的连接。如果连接池已满,请求会被放入等待队列,直至有连接归还。 6. **...

    bonecp 0.7.1 jar包以及源码

    这个标题提及的是"bonecp 0.7.1 jar包以及源码",这意味着我们拥有 BoneCP 的特定版本0.7.1-rc2的二进制jar文件和源代码,这对于开发者来说非常有价值,因为可以直接查看和理解其内部工作原理。 1. **BoneCP简介**...

    java数据库连接池-bonecp java源码

    在深入研究 BoneCP 的源码时,可以关注以下几个关键组件: 1. `ConnectionHandle`:这是 BoneCP 提供的接口,代表数据库连接,实际的实现类通常继承自JDBC的`java.sql.Connection`。 2. `PoolConfiguration`:包含...

    bonecpdemo 含jar包源码

    【骨CP(BoneCP)连接池详解】 BoneCP是一款高效的、开源的JDBC数据库连接池,它被设计成轻量级且易于集成到其他项目中。在Java开发中,数据库连接池是必不可少的组件,它提高了数据库操作的性能,通过复用已建立...

    bonecp连接池demo

    BoneCP 的源码阅读可以帮助开发者深入理解其内部机制,例如连接分配、回收、线程安全等方面的实现。同时,对于工具的熟练使用,能够帮助开发人员更高效地管理数据库连接,提升应用的性能和稳定性。 在实际项目中,...

    Bonecp参数配置.doc

    ### BoneCP参数配置详解 BoneCP,全称Bone Connection Pool,是Java环境下一款高效、轻量级的数据库连接池解决方案,特别适用于高并发环境。它通过优化连接管理和资源分配策略,能够显著提升数据库访问效率,降低...

    BoneCP数据源应用

    BoneCP 数据源是一种高效、快速的数据连接池技术,它被设计用于提高应用程序处理数据库连接的性能和效率。在Java环境中,数据库连接池是管理数据库连接的关键组件,它减少了创建和销毁连接的开销,从而提升了整体...

    JAVA源码Java数据库连接池BoneCP

    JAVA源码Java数据库连接池BoneCP

    BoneCP的xml使用实例

    BoneCP是一种高效的、开源的Java连接池实现,它旨在提供比其他常见的数据库连接池如C3P0和DBCP更高的性能。在这个实例中,我们将学习如何通过XML配置文件来使用BoneCP,以及如何在Java代码中加载这个配置。 首先,...

    基于java的开发源码-数据库连接池 BoneCP.zip

    基于java的开发源码-数据库连接池 BoneCP.zip 基于java的开发源码-数据库连接池 BoneCP.zip 基于java的开发源码-数据库连接池 BoneCP.zip 基于java的开发源码-数据库连接池 BoneCP.zip 基于java的开发源码-数据库...

    Bonecp实例

    通过阅读源码,我们可以更好地理解BoneCP的工作原理,从而在实际开发中更加灵活地使用它,解决特定场景下的性能瓶颈。 此外,了解 BoneCP 的工作原理对于优化数据库访问性能至关重要。例如,通过调整连接池的配置...

    bonecp-0.8.0.RELEASE.jar

    BoneCP 是一个高效的开源连接池实现,主要用于Java应用程序中数据库连接的管理。它提供了一种高效、可配置的方式来管理和复用数据库连接,从而提高应用程序的性能和稳定性。在标题中提到的 "bonecp-0.8.0.RELEASE....

    基于Java的实例源码-数据库连接池 BoneCP.zip

    本实例源码是关于BoneCP数据库连接池的实现,它是一个高效且轻量级的连接池库,适用于Java环境。在本压缩包中,包含了配置文件bonecp-default-config.xml以及相关的类库。 首先,`bonecp-default-config.xml`是...

    BoneCP 连接池学习笔记

    当应用程序需要使用数据库时,它可以从池中获取一个已存在的连接,而不是每次都去创建新的连接。用完后,应用程序会将连接归还到池中,而不是关闭它。这样可以避免频繁地建立和关闭连接,从而提高系统的性能和资源...

    BoneCP(连接oracle例子+jar包)

    数据库连接池在初始化时会创建一定数量的数据库连接,并将这些连接存储起来,当应用程序需要连接数据库时,可以从连接池中获取,而不是每次请求都创建新的连接。这种方式可以显著提高数据库访问的效率,减少资源消耗...

    bonecp0.7 所有jar包

    BoneCP是一款轻量级的Java数据库连接池,它以其高效性能和简洁的API而受到开发者们的欢迎。在Java应用程序中,数据库连接池是至关重要的组件,它可以有效地管理和复用数据库连接,减少创建和销毁连接的开销,提高...

    bonecp数据库连接池jar包

    bonecp数据库连接池jar包0.7.1: bonecp-0.7.1.RELEASE.jar bonecp-provider-0.7.1-rc2.jar bonecp-spring-0.7.1.RELEASE.jar

Global site tag (gtag.js) - Google Analytics