一.不能被Spring AOP事务增强的方法:
1.基于接口的动态代理:除public外的其他所有的方法,此外public static也不能被增强。
2.基于CGLib的动态代理:private、static、final的方法。
二.混合数据访问技术框架:
1.Hibernate+Spring JDBC或iBatis,事务管理器:org.springframework.orm.hibernate3.HibernateTransactionManager.
2.JPA+Spring JDBC或iBatis,事务管理器:org.springframework.orm.jpa.JpaTransactionManager.
3.JDO+Spring JDBC或iBatis,事务管理器:org.springframework.orm.jdo.JdoTransactionManager.
三.底层连接资源的访问问题:
只要你的程序都使用Spring DAO的模板(如JdbcTemplate、HibernateTemplate等)进行数据访问,一定不会存在数据连接泄露的问题。如果使用Spring Dao模板进行数据操作,我们无须关注数据连接(Connection)及其衍生品(Hibernate的Session等)的获取和释放操作,模板类已经通过其内部流程替我们完成了。
如何获取这些被Spring管控的数据连接呢?Spring提供了两种方法:其一是使用数据资源获取工具类;其二是对数据源(或其衍生品如Hibernate的SessionFactory)进行代理。
直接通过数据源获取连接(jdbcTemplate.getDataSource().getConnection()),需要显式释放,不然会出现连接泄漏问题。
Spring提供了一个能从当前事务上下文中获取绑定的数据连接的工具类,那就是DataSourceUtils。Spring强调必须使用DataSourceUtils工具类获取数据连接。
Spring在有事务上下文的情况下可以只获取连接不用显式释放连接:
Connection con=DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
Spring在没有事务上下文的情况下需要显式释放连接:
Connection = null;
Try{
con=DataSourceUtils.getConnection(jdbcTemplate.getDataSource());
}...finally{
DataSourceUtils.releaseConnection(conn,jdbcTemplate.getDataSource));
}
还可以通过TransactionAwareDataSourceProxy对数据源进行代理,数据源对象被代理后就具有了事务上下文感知的能力:
<bean id="originDataSource" class="org.apache.common.dbcp.BasicDataSource" destroy-method="close">...
<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
p:targetDataSource-ref="orginDataSource"/>
我们可以通过数据源代理对象的getConnection()获取事务上下文中绑定的数据连接了,注意方法存在事务上下文。
下面列出了不同数据访问技术对应的DataSourceUtils的等价类:
Spring JDBC:org.springframework.jdbc.datasource.DataSourceUtils.
Hibernate:org.springframework.orm.hibernate3.SessionFactoryUtils.
iBatis:org.springframework.jdbc.datasource.DataSourceUtils
JPA:org.springframework.orm.jpa.EntityManagerFactoryUtils.
JDO:org.springframework.orm.jdo.PersistenceManagerFactoryUtils.
下面列出了不同数据访问框架下TransactionAwareDataSourceProxy的等价类:
Spring JDBC:org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
Hibernate:org.springframework.orm.hibernate3.LocalSessionFactoryBean.
iBatis:org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
JPA:无。
JDO:org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy.