Skip to content

使用Spring4的JavaConfig整合Druid Hibernate4.3

吴玉林 edited this page Jan 16, 2018 · 4 revisions

本文不详细描述整合的过程,我把可以运行的代码提交到github,后面代码的地址。

什么是JavaConfig

JavaConfig就是使用注释来描述Spring Bean配置的组件。Spring使用注释来描述Bean的配置与采用XML相比,因类注释是在一个类源代码中,可以获得类型安全检查的好处。可以良好的支持重构。
Spring的spring-boot子项目有对JavaConfig的深入支持,官方文档以入门基础为主,深入的文档较少,深入研究需要看源码,作为年轻的项目,还有很长的路要走。[2014-07]

例子SHD201407-app

1 基于maven的项目,整合内容spring4.0.3+hibernate4.3.5+jpa2.1+druid1.0.6+JDK8编写
2 Spring的JavaConfig编写代码。
3 使用Druid连接池管理数据库连接,druid1.0.6提供的DruidConnectionProvider不适用Hibernate4.3,抛出下面的异常:
  Caused by: java.lang.ClassNotFoundException: org.hibernate.service.jdbc.connections.spi.ConnectionProvider
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 65 more
在项目中,参考原有实现com.urely.shd2014.DruidConnectionProvider,就可以继续使用。
对JavaConfig整合感兴趣的同学,可以通过下面地址下载源码学习:[https://github.com/guocw998/SHD201407-app](https://github.com/guocw998/SHD201407-app)

factory.afterPropertiesSet()切入点

	@Bean
	public EntityManagerFactory entityManagerFactory() throws SQLException {
	HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

// vendorAdapter.setGenerateDdl(true);

	LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();

// factory.setJpaProperties(jpaProperties); factory.setJpaVendorAdapter(vendorAdapter); factory.setPackagesToScan("com.urely.shd2014.entity"); // factory.setDataSource(dataSource()); logger.info("Before LocalContainerEntityManagerFactoryBean.afterPropertiesSet():::"+factory.getJpaPropertyMap()); factory.afterPropertiesSet(); logger.info("After LocalContainerEntityManagerFactoryBean.afterPropertiesSet():::"+factory.getJpaPropertyMap());

	return factory.getObject();
}


大家在研究过程中,都会和我一样有疑问:我们hibernate配置属性和Druid配置属性是如何正确加载到Spring容器?Spring容器如何正确的初始化数据源DataSource的?
Spring的JavaConfig编程过程,Spring容器加载hibernate.properties配置,就能根据配置去初始化数据源DataSource和相应的数据数据处理层的初始化——这些神奇的过程都发生在factory.afterPropertiesSet()中。

hibernate.properties

##############################################################
# spring+hibernate+jpa整合到时候,javaconfig的方式避免了XML,配置文件会自动加载到Hibernate的环境中:Environment
# 在Properties p = org.hibernate.cfg.Environment.getProperties()中有所有hibernate.properties的属性。
# 
# 把Druid配置整合到这里声明
# 
##############################################################

##################################################################################### ###采用Druid连接池,下面的吉祥hibernate配置使用Druid的。

#hibernate.connection.url=jdbc:mysql://localhost:3306/superweb?useUnicode=true&characterEncoding=utf-8 #hibernate.connection.driver_class=com.mysql.jdbc.Driver #hibernate.connection.username=root #hibernate.connection.password= #c3p0 #hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider #####################################################################################

##################################################################################### #####保留的hiber配置 #MYSQL hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect #设置外连接抓取树的最大深度 hibernate.max_fetch_depth=3 #设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。 hibernate.jdbc.fetch_size=50

hibernate.jdbc.batch_size=50 #自动建表类型 validate|create|create-drop|update hibernate.hbm2ddl.auto=create-drop #是否显示SQL hibernate.show_sql=true #显示SQL是否格式化 hibernate.format_sql=true #关闭二级缓存 hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider #####################################################################################

##################################################################################### #Druid配置 #Druid::注意这里配置的ConnectionProvider!!! 第一次,配置错误了导致直接加不成功的异常!! #hibernate.connection.provider_class=com.alibaba.druid.support.hibernate.DruidConnectionProvider hibernate.connection.provider_class=com.urely.shd2014.DruidConnectionProvider

基本属性 url、user、password

url=jdbc:mysql://localhost:3306/superweb?useUnicode=true&characterEncoding=utf-8 username=root password= ##数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass driverClassName=com.mysql.jdbc.Driver

###pool settings initialSize=0 maxActive=20 ###已经不再使用,配置了也没效果 ##maxIdle=20 ##最小连接池数量 minIdle=3 ##获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 maxWait=60000

##是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 poolPreparedStatements=false ##要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 maxOpenPreparedStatements=-1

#用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。 validationQuery=SELECT 'x' testOnBorrow=false testOnReturn=false testWhileIdle=true

##有两个含义:1) Destroy线程会检测连接的间隔时间, 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明 timeBetweenEvictionRunsMillis=60000

##不再使用,一个DruidDataSource只支持一个EvictionRun #numTestsPerEvictionRun

#minEvictableIdleTimeMillis #connectionInitSqls #exceptionSorter

filters=stat #proxyFilters ###Druid::作者建议::在上面的配置中,通常你需要配置url、username、password,maxActive这四项。 #####################################################################################

Clone this wiki locally