gpt4 book ai didi

hibernate - WAS 6.1,JPA 与 JTA, hibernate ,Spring : data retrieval problem

转载 作者:行者123 更新时间:2023-12-02 23:58:41 27 4
gpt4 key购买 nike

我正在运行具有以下组件的应用程序:

  • Oracle 9i
  • 带有 WS 和 EJB3 功能包的 WAS 6.1.0.23
  • 以 Hibernate 3.3.2.GA 作为提供程序的 JPA(使用 Hibernate-EntityManager 3.4.0)
  • WAS 的 Spring 事务管理器:UowTransactionManager (spring 2.5.6)
  • 具有流管理持久性的 Spring webflow (2.0.8),即实体管理器被序列化到 http session 中,并在每个请求时恢复。

在从 Web Controller 到服务层(用 Spring 的 @Transactional 注释)的每个请求中,我注意到对于 Hibernate 在事务内的服务调用期间执行的每个 SQL 查询,都会从该层请求一个新的 DataSource 连接。 jndi DataSource 由 Hibernate 的 ConnectionProvider 提供,直到 DataSource 耗尽可用连接并最终挂起。

以下是部分配置:

  1. Spring :

    <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>
  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>
  3. 服务

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

    @Repository
    public class MyDaoJap implements MyDao {
    @PersistenceContext EntityManager em;
    public void findSomething() {
    em.find(...);
    }
    }

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

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

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

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

感谢您的帮助。

最佳答案

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

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

甚至可能是内部配置问题

关于hibernate - WAS 6.1,JPA 与 JTA, hibernate ,Spring : data retrieval problem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1859658/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com