我正在运行包含以下组件的应用程序:
> Oracle 9i
>带有WS和EJB3功能包的WAS 6.1.0.23
> JPA与Hibernate 3.3.2.GA作为提供者(使用Hibernate-EntityManager 3.4.0)
> WAS的Spring事务管理器:UowTransactionManager(spring 2.5.6)
>具有流管理持久性的Spring Webflow(2.0.8),即实体管理器被序列化为http会话,并在每个请求上恢复.
在从Web控制器到服务层的每个请求中(使用Spring的@Transactional注释),我注意到对于Hibernate在事务内部的服务调用期间执行的每个SQL查询,都会从jndi DataSource请求新的DataSource连接. Hibernate的ConnectionProvider,直到DataSource用完了空闲连接并最终挂起.
以下是配置的一部分:
>春天:
factorybean">
> persistence.xml
sql" value="true"/>
sql" value="true"/>
>服务
@Transactional(readOnly=true) @Service
public class MyServiceImpl implements MyService {
@Autowired MyDao dao;
public void getSomething() {
dao.findSomething();
}
}
> DAO
@Repository
public class MyDaoJap implements MyDao {
@PersistenceContext EntityManager em;
public void findSomething() {
em.find(...);
}
}
请注意,事务是只读的,这对于流持久性来说是正常的:只有最后一次转换(使用commit = true)才会调用非readOnly事务方法.打开readOnly标志会自动将休眠刷新模式切换为MANUAL.
在做一些调试时,我注意到以下内容:
>在服务的拦截链中正确调用UOW事务管理器,这表明事务处于活动状态
> Hibernate通过在注入EMF的原始DataSource上调用DataSource.getConnection()来请求连接;获取连接的策略来自Hibernate的InjectedDataSourceConnectionProvider,此类引用WAS DataSource(不是知道活动事务的代理等).
我想问题是在第二点,但我在配置中找不到错误.有人可以帮忙吗?
谢谢你的帮助.
> hibernate prop – hibernate.connection.release_mode = after_statement
> web.xml资源参考数据源配置 – < res-sharing-scope>可共享< / res-sharing-scope>
> spring sessionFactory config – useTransactionAwareDataSource =“true”
它甚至可能是内部的配置问题