春季休眠需要更多时间的任何原因?

斯里拉姆

目前,我正在春季和冬眠的一个项目上工作。花更多的时间来获取记录并在JSP中显示这些记录。我将时间戳记无处不在,以了解花费更多时间的地方:

Time @ HomeController[start] : 2014-07-09 18:58:52.621
**Time @ userService[start] : 2014-07-09 18:58:52.622**
**Time @ UserDao[start] : 2014-07-09 18:58:57.678**
Time before executing Query : 2014-07-09 18:58:57.678
Time After executing Query : 2014-07-09 18:58:59.272
Time @ UserDao[end] : 2014-07-09 18:58:59.272
Time @ userService[End] : 2014-07-09 18:59:00.068
Time @ HomeController[end] : 2014-07-09 18:59:00.068
Time stamp in JSP :2014-07-09 18:59:00.129

通过以上分析,从服务层到DAO层大约需要5秒钟,我在下面给出了服务和DAO的代码:

UserService :

     public class UserServiceImpl implements UserService {  
    @Override  
    public List<User> getUserpagination(int page) {
        System.out.println("Time @ userService[start] : "+new Timestamp(new Date().getTime())); ----------- (1)
        List<User> u = userDao.getUserpagination(page);
        System.out.println("Time @ userService[End] : "+new Timestamp(new Date().getTime()));
        return u;
     }
  }  

UserDao :

    public class UserDaoImpl implements UserDao { 
      @Override  
      @Transactional  
      public List<User> getUserpagination(int page) {  

        System.out.println("Time @ UserDao[start] : "+new Timestamp(new Date().getTime())); ------- (2)


        return userlist;  

    } 

因此,从第(1)行到第(2)行需要5秒钟。谁能解释为什么以及如何减少时间?

我正在从属性文件获取数据库连接:

jdbc.properties:

database.driver=oracle.jdbc.driver.OracleDriver 
database.url=jdbc:oracle:thin:@xxx.xxx.xxx.xx:1521:osm
database.user=osm  
database.password=xxxxxx  
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.show_sql=true  
hibernate.hbm2ddl.auto=create/update   

下面是XML文件中的配置:

<context:property-placeholder location="classpath:jdbc.properties" />

<tx:annotation-driven transaction-manager="hibernateTransactionManager" />


<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${database.driver}" />
    <property name="url" value="${database.url}" />
    <property name="username" value="${database.user}" />
    <property name="password" value="${database.password}" />
</bean>


<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="annotatedClasses">
        <list>
            <value>com.xxx</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>

        </props>

    </property>

 </bean>

<bean id="hibernateTransactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

现在,我使用了HikariCP,并且出现了超时错误:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/springhiber1] threw exception [Request processing failed; nested exception is    org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate  Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException:  Cannot open connection] with root cause
java.sql.SQLException: Timeout of 30000ms encountered waiting for connection.
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:192)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:91)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
然后马库斯
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${database.driver}" />
    <property name="url" value="${database.url}" />
    <property name="username" value="${database.user}" />
    <property name="password" value="${database.password}" />
</bean>

在您的配置中,您正在使用DriverManagerDataSource尽管这只是一个适当的数据源实现。它不是连接池。发生的情况是,每个连接都是按需创建的,需要关闭后,它将立即关闭。这是性能的杀手er。

如果要提高性能,请使用连接池。有很多实现

  1. Tomcat JDBC
  2. 公用DBCP
  3. C3P0
  4. 光明CP

只需dataSource使用适当的连接池替换bean定义。例如,如果您想用HikariCP替换它,则可以使用类似的方法。

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown">
    <property name="dataSourceClassName" value="oracle.jdbc.pool.OracleDataSource" />
    <property name="connectionTestQuery" value="SELECT 1 FROM DUAL" />
    <property name="dataSource.user" value="${database.user}" />
    <property name="dataSource.password" value="${database.password}" />
    <property name="dataSource.url" value="${database.url}" />
</bean>

当然,您将不得不为池本身添加依赖项。

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>1.4.0</version>
    <scope>compile</scope>
</dependency>

有关可以设置哪些属性的信息,请参见HikariCP文档和Oracle Datasource文档。

另一件事是,您的代码库中散布着许多行来衡量性能,这确实不是最明智的事情,也不是非常有效。我建议使用一些AOP对代码进行性能评估,然后例如可以在生产中轻松将其删除。现在,您必须清理整个代码库。

Spring已经有一个PerformanceMonitorInterceptor您可以使用和配置的。如果您想进行更精细的测量,可以使用JamonPerformanceMonitorInterceptor

<bean id="performanceInterceptor" class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"/>

<aop:config>
    <aop:pointcut id="ourMethods" expression="execution(* com.your.base-package..*.*(..))"/>
    <aop:advisor pointcut-ref="ourMethods" advice-ref="performanceInterceptor"/>
</aop:config>

现在,您可以轻松地测量和记录性能。保持代码整洁,您可以衡量所需的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Blob由于任何原因未存储任何值

来自分类Dev

没有任何原因的PrintStream错误?

来自分类Dev

C中if(function()== TRUE)的任何原因

来自分类Dev

没有任何原因的PrintStream错误?

来自分类Dev

奇怪的PHP编码代码。任何原因?

来自分类Dev

意外的文件结束错误,查找常见原因但找不到任何原因

来自分类Dev

Rails中的TX不应有任何原因require_new:true

来自分类Dev

角度-更新范围会导致页面滚动的任何原因

来自分类Dev

任何原因导致此javascript闪烁代码不起作用?

来自分类Dev

防止未分配的对象,这是出于不良设计考虑的任何原因?

来自分类Dev

foreach迭代变量是否可以由于任何原因而不变?

来自分类Dev

是否有任何原因默认的十进制文字不是Clojure中的BigDecimal类型?

来自分类Dev

是否有任何原因为何使用std :: tuple传递c ++模板包

来自分类Dev

为什么不将数据存储在此结构中的任何原因?

来自分类Dev

“ mousePressed / mouseClicked”由于任何原因均不起作用

来自分类Dev

Modernizr和CSS-不应用此规则的任何原因?

来自分类Dev

是否可以出于任何原因在每个路径中注册两个WatchKey?

来自分类Dev

可以因为任何原因而使foreach迭代变量不变吗?

来自分类Dev

是否有任何原因未触发此事件功能?

来自分类Dev

Java new Thread使用此方法-好的/不好的任何原因吗?

来自分类Dev

是否应出于任何原因避免使用application / x-httpd-php .html?

来自分类Dev

防止未分配的对象,这是出于不良设计考虑的任何原因吗?

来自分类Dev

角度-更新范围会导致页面滚动的任何原因

来自分类Dev

在 ASP.Net Core 2.0 中由于任何原因停止 Kestrel 时的预制清理

来自分类Dev

MySQL查询在phpmyadmin中工作但在php代码中没有任何原因?

来自分类Dev

普通选择查询需要更多时间

来自分类Dev

Python多处理需要更多时间

来自分类Dev

std :: multiplies和std :: dives是否以第三人称存在任何原因?

来自分类Dev

是否有任何原因在此代码块的List <T>中找不到现有项目?

Related 相关文章

  1. 1

    Blob由于任何原因未存储任何值

  2. 2

    没有任何原因的PrintStream错误?

  3. 3

    C中if(function()== TRUE)的任何原因

  4. 4

    没有任何原因的PrintStream错误?

  5. 5

    奇怪的PHP编码代码。任何原因?

  6. 6

    意外的文件结束错误,查找常见原因但找不到任何原因

  7. 7

    Rails中的TX不应有任何原因require_new:true

  8. 8

    角度-更新范围会导致页面滚动的任何原因

  9. 9

    任何原因导致此javascript闪烁代码不起作用?

  10. 10

    防止未分配的对象,这是出于不良设计考虑的任何原因?

  11. 11

    foreach迭代变量是否可以由于任何原因而不变?

  12. 12

    是否有任何原因默认的十进制文字不是Clojure中的BigDecimal类型?

  13. 13

    是否有任何原因为何使用std :: tuple传递c ++模板包

  14. 14

    为什么不将数据存储在此结构中的任何原因?

  15. 15

    “ mousePressed / mouseClicked”由于任何原因均不起作用

  16. 16

    Modernizr和CSS-不应用此规则的任何原因?

  17. 17

    是否可以出于任何原因在每个路径中注册两个WatchKey?

  18. 18

    可以因为任何原因而使foreach迭代变量不变吗?

  19. 19

    是否有任何原因未触发此事件功能?

  20. 20

    Java new Thread使用此方法-好的/不好的任何原因吗?

  21. 21

    是否应出于任何原因避免使用application / x-httpd-php .html?

  22. 22

    防止未分配的对象,这是出于不良设计考虑的任何原因吗?

  23. 23

    角度-更新范围会导致页面滚动的任何原因

  24. 24

    在 ASP.Net Core 2.0 中由于任何原因停止 Kestrel 时的预制清理

  25. 25

    MySQL查询在phpmyadmin中工作但在php代码中没有任何原因?

  26. 26

    普通选择查询需要更多时间

  27. 27

    Python多处理需要更多时间

  28. 28

    std :: multiplies和std :: dives是否以第三人称存在任何原因?

  29. 29

    是否有任何原因在此代码块的List <T>中找不到现有项目?

热门标签

归档