1

Spring 3.1.1.RELEASE、Hibernate 4.1.0.Final、JPA 2.0、および JBoss 7.1.1.Final を使用して Web アプリケーション (WAR) を構築しています。ビューを提供する前に、コントローラーにいくつかのオブジェクトを遅延ロードしたいので、「OpenEntityManagerInViewInterceptor」を試してみようと思いました。SPring アプリケーション コンテキスト ファイルでこれを構成しました …</p>

<mvc:interceptors>
    …
    <mvc:interceptor>
            <mvc:mapping path="/contracts/*"/>
            <bean class="org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor">  
                <property name="entityManagerFactory" ref="entityManagerFactory" />  
            </bean>
    </mvc:interceptor>
</mvc:interceptors>

遅延ロードしたいエンティティがあります…</p>

@Entity
@Table(name = "cb_contract")
@Cacheable
@DataTransferObject
public class Contract implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(generator = "uuid-strategy")
    private String id;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PRODUCT_ID")
    @NotNull
    private Product product;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ORGANIZATION_ID")
    @NotNull
    private Organization org;

私のコントローラーは、これらのフィールドに非常に簡単にアクセスしようとします…</p>

@RequestMapping(value = "/update/{id}", method = RequestMethod.GET)
public ModelAndView doGetUpdate(final HttpServletRequest request,
                                final Model model,
                                @PathVariable final String id)
{
    String nextPage = "landing";
    final Contract contract = m_contractService.findById(id);
    if (contract != null)
    {
        final ContractForm contractForm = new ContractForm(contract.getProduct(), 
        ...

残念ながら、JSP ページにアクセスしようとすると、読み込みに約 20 秒かかります (以前は 2 秒しかかかりませんでした)。遅延ロードしたいエンティティだけでなく、ページ上のすべてのエンティティに対して、Spring の何かが繰り返し「参加する JTA トランザクションを探しています」と「JDBC 接続を取得しています」ようです。これをより適切に構成して高速化するためにできることはありますか?

ありがとう - デイブ

編集:構成は次 のとおりです。Spring 3.1 を使用すると、persistence.xml ファイルは必要ありません。これがentityManagerFactoryです...

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="org.mainco.springboard" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaPropertyMap" ref="jpaPropertyMap" />
</bean>

<util:map id="jpaPropertyMap">
    <entry key="show_sql" value="true" />
    <entry key="dialect" value="org.hibernate.dialect.MySQLDialect" />
    <entry key="hibernate.hbm2ddl.auto" value="validate" />
    <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
    <entry key="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
    <entry key="hibernate.cache.use_second_level_cache" value="true" />
    <entry key="hibernate.cache.use_query_cache" value="false" />
    <entry key="hibernate.generate_statistics" value="false" />
</util:map>

<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<jee:jndi-lookup jndi-name="java:jboss/datasources/MySqlDS" id="dataSource" expected-type="javax.sql.DataSource"/>

<tx:jta-transaction-manager />

JBoss 7.1.1.Final に付属するデフォルトのトランザクション マネージャーを使用します。ここにデータソースがあります

        <datasources>
            <datasource jndi-name="java:jboss/datasources/MySqlDS" pool-name="MySqlDS" enabled="true" use-java-context="true">
                <connection-url>jdbc:mysql://localhost:3306/mydb_db</connection-url>
                <driver>mysql</driver>
                <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
                <pool>
                    <min-pool-size>10</min-pool-size>
                    <max-pool-size>100</max-pool-size>
                    <prefill>true</prefill>
                </pool>
                <security>
                    <user-name>my_db</user-name>
                    <password>my_db</password>
                </security>
                <statement>
                    <prepared-statement-cache-size>32</prepared-statement-cache-size>
                    <share-prepared-statements>true</share-prepared-statements>
                </statement>
            </datasource>
            <drivers>
                <driver name="mysql" module="com.mysql"/>
            </drivers>
        </datasources>
4

1 に答える 1

0

JTA + Hibernateを使用する場合の接続解放モードは、デフォルトで「after_statment」に設定されています。これが、これらすべてのログを取得する理由だと思います。

私が提案できるのは、hibernate configで次のパラメーターを指定して、このデフォルトを「on_close」または「after_transaction」に変更することです。

hibernate.connection.release_mode="on_close"

のすべての可能な値hibernate.connection.release_modeafter_transaction、、after_statementおよびon_close

于 2013-02-14T13:21:03.900 に答える