WAS 6.1,JPA与JTA,Hibernate,Spring:数据检索问题

Gae*_*tan 6 spring hibernate jpa jta websphere-6.1

我正在运行包含以下组件的应用程序:

  • 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用完了空闲连接并最终挂起.

以下是配置的一部分:

  1. 弹簧:

    <tx:annotation-driven />
    <context:component-scan base-package="org.home.myapp" />
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/DS" resource-ref="true"/>
    <bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>
    <bean id="EMF" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource"/>
      <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
      </property>
    </bean>
    
    Run Code Online (Sandbox Code Playgroud)
  2. persistence.xml中

    <persistence-unit name="persistence" transaction-type="JTA">
      <properties>
        <property name="hibernate.archive.autodetection" value="class"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
        <property name="hibernate.current_session_context_class" value="jta"/>
        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
        <property name="hibernate.format_sql" value="true"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.default_batch_fetch_size" value="20"/>
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"/>   
      </properties>
    </persistence-unit>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 服务

    @Transactional(readOnly=true) @Service
    public class MyServiceImpl implements MyService {
      @Autowired MyDao dao;
      public void getSomething() {
        dao.findSomething();
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. DAO

    @Repository
    public class MyDaoJap implements MyDao {
      @PersistenceContext EntityManager em;
      public void findSomething() {
        em.find(...);
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

请注意,事务是只读的,这对于流持久性来说是正常的:只有最后一次转换(使用commit = true)才会调用非readOnly事务方法.打开readOnly标志会自动将休眠刷新模式切换为MANUAL.

在做一些调试时,我注意到以下内容:

  • 在服务的拦截链中正确调用UOW事务管理器,这表明事务处于活动状态
  • Hibernate通过在注入EMF的原始DataSource上调用DataSource.getConnection()来请求连接; 获取连接的策略来自Hibernate的InjectedDataSourceConnectionProvider,此类引用WAS DataSource(不是知道活动事务的代理等).

我想问题是在第二点,但我在配置中找不到错误.有人可以帮忙吗?

谢谢你的帮助.

Mic*_*low 2

我们的配置中的一些疯狂猜测

  • hibernate 属性 - hibernate.connection.release_mode=after_statement
  • web.xml 资源引用数据源配置 - <res-sharing-scope>可共享</res-sharing-scope>
  • spring sessionFactory 配置 - useTransactionAwareDataSource="true"

它甚至可能是内部的配置问题