`

hibernate 不得不说的那些事--Connection Provider

阅读更多

ConnectionProvider 在hibernate 3.2.3中有五种实现 ,分别是DatasourceConnectionProvider、C3P0ConnectionProvider、ProxoolConnectionProvider、DriverManagerConnectionProvider、UserSuppliedConnectionProvider。

 

 DatasourceConnectionProvider:使用JNDI注册的数据源,如果要使用它,需配置hibernate.connection.datasource 属性。

 

 C3P0ConnectionProvider:使用了C3P0连接池,如果要使用它,需配置hibernate.c3p0.*属性,

 

 ProxoolConnectionProvider:使用了Proxool连接池,如果要使用它,需配置hibernate.proxool.*属性

 

 DriverManagerConnectionProvider:使用了java.sql.DriverManager,也实现了一个简单的连接池。

 

 UserSuppliedConnectionProvider:ConnectionProvider接口的实现,当请求连接的时候,抛出异常。

 

hibernate获取Connection Provider的源代码如下:

 

public static ConnectionProvider newConnectionProvider(Properties properties, Map connectionProviderInjectionData) throws HibernateException {
		ConnectionProvider connections;
		String providerClass = properties.getProperty(Environment.CONNECTION_PROVIDER);
		if ( providerClass!=null ) {
			try {
				log.info("Initializing connection provider: " + providerClass);
				connections = (ConnectionProvider) ReflectHelper.classForName(providerClass).newInstance();
			}
			catch (Exception e) {
				log.fatal("Could not instantiate connection provider", e);
				throw new HibernateException("Could not instantiate connection provider: " + providerClass);
			}
		}
		else if ( properties.getProperty(Environment.DATASOURCE)!=null ) {
			connections = new DatasourceConnectionProvider();
		}
		else if ( properties.getProperty(Environment.C3P0_MAX_SIZE)!=null ) {
			connections = new C3P0ConnectionProvider();
		}
		else if (
			properties.getProperty(Environment.PROXOOL_XML)!=null ||
			properties.getProperty(Environment.PROXOOL_PROPERTIES)!=null ||
			properties.getProperty(Environment.PROXOOL_EXISTING_POOL)!=null
		) {
			connections = new ProxoolConnectionProvider();
		}
		else if ( properties.getProperty(Environment.URL)!=null ) {
			connections = new DriverManagerConnectionProvider();
		}
		else {
			connections = new UserSuppliedConnectionProvider();
		}

		if ( connectionProviderInjectionData != null && connectionProviderInjectionData.size() != 0 ) {
			//inject the data
			try {
				BeanInfo info = Introspector.getBeanInfo( connections.getClass() );
				PropertyDescriptor[] descritors = info.getPropertyDescriptors();
				int size = descritors.length;
				for (int index = 0 ; index < size ; index++) {
					String propertyName = descritors[index].getName();
					if ( connectionProviderInjectionData.containsKey( propertyName ) ) {
						Method method = descritors[index].getWriteMethod();
						method.invoke( connections, new Object[] { connectionProviderInjectionData.get( propertyName ) } );
					}
				}
			}
			catch (IntrospectionException e) {
				throw new HibernateException("Unable to inject objects into the conenction provider", e);
			}
			catch (IllegalAccessException e) {
				throw new HibernateException("Unable to inject objects into the conenction provider", e);
			}
			catch (InvocationTargetException e) {
				throw new HibernateException("Unable to inject objects into the conenction provider", e);
			}
		}
		connections.configure(properties);
		return connections;
	}

 从源代码不难看出这么多种Connection Provider的优先顺序 :

 

自定义Connection Provider >DatasourceConnectionProvider>C3P0ConnectionProvider

> ProxoolConnectionProvider>DriverManagerConnectionProvider>UserSuppliedConnectionProvider

 

首先hibernate检测hibernate.connection.provider_class是否配置了,如果配置了,则根据该配置对应的类(必须要实现ConnectionProvider接口,含无参构造函数)名实例化。

 

如果hibernate.connection.provider_class没有配置,则检测hibernate.connection.datasource配置,如果配置了,则使用DatasourceConnectionProvider。

 

如果hibernate.connection.datasource没有配置,则检测hibernate.c3p0.max_size,如果配置了,则使用C3P0ConnectionProvider。

 

如果hibernate.c3p0.max_size没有配置,则检测hibernate.proxool.xml、hibernate.proxool.properties、hibernate.proxool.existing_pool的配置,只要其中任何一个配置了,则使用ProxoolConnectionProvider。

 

 

如果hibernate.proxool.xml、hibernate.proxool.properties、hibernate.proxool.existing_pool都没有配置,则检测hibernate.connection.url的配置,则使用DriverManagerConnectionProvider。

 

如果以上没有配置的话,则使用UserSuppliedConnectionProvider(抛出异常),提示需要提供连接。

 

分享到:
评论
1 楼 JTeye 2017-03-13  
太有用了, 谢了!

相关推荐

    hibernate-jpa-2.1-api-1.0.2.Final-API文档-中文版.zip

    赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...

    hibernate jar包:hibernate-commons-annotations-4.0.1.Final.jar等

    hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-4.1.12.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar ...

    hibernate-jpa-2.1-api-1.0.2.Final-API文档-中英对照版.zip

    赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar

    hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernate-jpa-2.0-api-1.0.1.Final.jar

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    总的来说,`hibernate-jpa-2.1-api-1.0.0.final.jar`为开发者提供了丰富的JPA 2.1特性的实现,使得在Java项目中使用Hibernate进行数据库操作变得更加便捷和标准化。通过深入理解和熟练运用这个API,我们可以构建出...

    hibernate-jpa-2.1-api-1.0.0.Final.jar

    hibernate-jpa-2.1-api-1.0.0.Final.jar官方下载,请放心使用

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    总的来说,理解和熟练运用`hibernate-configuration-3.0.dtd`和`hibernate-mapping-3.0.dtd`对于开发者来说至关重要,因为它们构成了Hibernate配置和对象映射的基础。通过这些文件,我们可以精确地配置Hibernate以...

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip)

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    spring分别与jdbc和hibernate结合的事务控制--案例

    本案例重点探讨了Spring如何与两种流行的数据访问技术——JDBC(Java Database Connectivity)和Hibernate——相结合,进行事务管理。事务控制是确保数据库操作一致性、完整性的关键,尤其在多步骤操作中,它能防止...

    Hibernate稳定版(hibernate-release-5.6.2.Final.zip)

    Hibernate稳定版(hibernate-release-5.6.2.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    hibernate,hibernate3,Middlegen-Hibernate-r5

    《Hibernate与Middlegen-Hibernate-r5:数据库持久化框架深度解析》 在Java开发领域,Hibernate是一个广泛应用的开源对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够以面向对象的方式处理数据库交互...

    hibernate-3.2.0

    hibernate-3.2.0源码和hibernate-3.2.0所有的jar包。

    hibernate-release-4.1.4

    【标题】"hibernate-release-4.1.4" 是Hibernate框架的一个版本发布,具体为4.1.4.Final。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发人员在处理数据库时使用面向对象的概念,极大地简化了数据库...

    hibernate-commons-annotations-5.0.1.Final.jar

    在本文中,我们将深入探讨`hibernate-commons-annotations-5.0.1.Final.jar`的源码,了解其内部结构和主要功能。 一、元数据注解 HCA的核心在于提供了一系列的注解,如`@Entity`、`@Table`、`@Column`、`@Id`等,...

    hibernate-4.1.4-final-API

    hibernate-4.1.4-final-API.chm 方便实用,支持索引,提高工作效率 与大伙分享

    DmDialect-for-hibernate4.0.zip

    本篇将详细介绍标题为"DmDialect-for-hibernate4.0.zip"的压缩包文件及其包含的两个重要组件:Dm7JdbcDriver17.jar和DmDialect-for-hibernate4.0.jar,以及它们在SpringBoot项目中的作用。 首先,SpringBoot是一个...

    hibernate-release-5.2.10

    2. **库文件**:包含jar包,如hibernate-core.jar、hibernate-entitymanager.jar等,这些是我们在项目中引入Hibernate时需要用到的依赖库。 3. **文档**:通常包括用户指南、API文档、开发者文档等,这些文档提供了...

    hibernate-extensions和Middlegen-Hibernate

    总结来说,hibernate-extensions和Middlegen-Hibernate是提高Hibernate开发效率的利器,它们通过自动化的方式,帮助开发者快速生成数据库映射文件和Java实体类,使得开发工作更加高效和便捷。合理利用这两个工具,...

Global site tag (gtag.js) - Google Analytics