Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring “我怎样才能加快速度?”;OpenEntityManagerViewInterceptor“;在我的web应用程序中?_Spring_Spring Mvc_Lazy Loading_Interceptor - Fatal编程技术网

Spring “我怎样才能加快速度?”;OpenEntityManagerViewInterceptor“;在我的web应用程序中?

Spring “我怎样才能加快速度?”;OpenEntityManagerViewInterceptor“;在我的web应用程序中?,spring,spring-mvc,lazy-loading,interceptor,Spring,Spring Mvc,Lazy Loading,Interceptor,我正在使用Spring3.1.1.RELEASE、Hibernate4.1.0.Final、JPA2.0和JBoss7.1.1.Final构建一个web应用程序(WAR)。我想懒洋洋地在我的控制器中加载一些对象(在它提供视图之前),所以我想我应该给“OpenEntityManagerViewInterceptor”一个旋转。我在我的SPring应用程序上下文文件中配置了这个 <mvc:interceptors> … <mvc:interceptor>

我正在使用Spring3.1.1.RELEASE、Hibernate4.1.0.Final、JPA2.0和JBoss7.1.1.Final构建一个web应用程序(WAR)。我想懒洋洋地在我的控制器中加载一些对象(在它提供视图之前),所以我想我应该给“OpenEntityManagerViewInterceptor”一个旋转。我在我的SPring应用程序上下文文件中配置了这个

<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>
我的控制器尝试非常简单地访问这些字段

@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连接”页面上的每个实体,而不仅仅是那些我想要延迟加载的实体。我可以做些什么来更好地配置它并使其更快

谢谢-戴夫

编辑:以下是配置。使用Spring3.1,我不需要persistence.xml文件。这是整个管理工厂

<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>

jdbc:mysql://localhost:3306/mydb_db
mysql
事务读取已提交
10
100
真的
我的
我的
32
真的

使用JTA+Hibernate时的连接释放模式默认设置为“在停止后”。我想这就是为什么你会得到这些日志

我建议您通过在hibernate配置中指定以下参数,将此默认值更改为“on_close”或“after_transaction”:

hibernate.connection.release_mode="on_close"

hibernate.connection.release\u模式的所有可能值都是
after\u transaction
after\u statement
on\u close

你能发布你的entityManagerFactory配置+持久化单元+transactionManager配置吗?@ben75,我编辑了我的问题,将Spring entitymanagerfactory配置和JTA数据源包括在内,如$JBOSS_HOME/standalone/configuration/standalone.xml文件中所定义的。无论有没有该属性,该应用程序仍然需要很长的时间(大约15秒)才能加载页面。Hibernate似乎正在扫描页面上加载的所有实体,甚至是没有惰性关联的实体。我看到类似“DEBUG[org.hibernate.internal.util.EntityPrinter](http--127.0.0.1-8080-5)org.mainco.subco.organization.domain.Country{id=DZ,name=alegaria}”的消息
hibernate.connection.release_mode="on_close"