当前位置: 首页 > 知识库问答 >
问题:

Spring mvc野蝇postgresql性能调整

澹台华采
2023-03-14

我花了很多时间试图找出导致我的应用程序工作非常缓慢的原因,也许有人会帮助我检查问题所在。

版本:

springmvc:4.2.5.发行版

Hibernate: 4.3.11.最终

spring-data-jpa: 1.8.2.RELEASE

野蝇: 10

PostgreSQL Server:9.4

操作系统:Debian GNU/Linux 7.9(wheezy)

服务器配置:VPS,1 proc,4GB RAM

关于我的应用:

带有静态JSP登录页面、信息页面和登录的简单Web应用html" target="_blank">程序重定向到私人区域。公共页面是静态的,在登录期间首先查询数据库,然后尝试为登录用户获取内容。

问题是什么:

当我浏览这样配置的页面时:

<http auto-config="true"> 
        <intercept-url pattern="/" access="permitAll"/>
        <intercept-url pattern="favicon.ico" access="permitAll"/>
        <intercept-url pattern="/login/**" access="permitAll"/>
        <intercept-url pattern="/info" access="permitAll"/>
...
</http>

没有问题,所有的东西都被装上了飞机,没有停顿。它工作顺利。当我在/login上发帖时(这将我重定向到/main ),然后当我在如下配置的每个站点上导航时:

<intercept-url pattern="/main/**" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/statistic/**" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />

有一些极端的延迟,有时甚至长达1分钟。

Hibernate配置

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!-- Configure the entity manager factory bean -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="pl.portal.model"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
        </property>
        <property name="jpaProperties">
            <props>
                <!-- <prop key="hibernate.dialect">pl.portal.sql.ProjectPsqlDialect</prop> -->
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
                <prop key="hibernate.jdbc.use_streams_for_binary">false</prop>
                <prop key="hibernate.connection.useUnicode">true</prop>
                <prop key="hibernate.connection.characterEncoding">UTF-8</prop>
                <prop key="hibernate.connection.characterSet">UTF-8</prop>

            </props>
        </property>
    </bean>

有谁能给我一个提示,如何确定是什么导致了延迟?在我的浏览器中检查webinspect-

EDIT2:删除了线程转储的无效片段,粘贴了在应用程序上调用操作/admin后启动的线程的完整转储。线程需要 61 秒

线程转储

共有3个答案

冯枫
2023-03-14

根据我的经验,您可能有数据库锁定问题。有一个sql锁定你的表一段时间。您的代码正在等待,然后锁被释放,您的代码继续。您可以监视数据库锁,以查找在代码挂起时哪个 sql 锁定了您的表。

束研
2023-03-14

关于如何分析性能,您可以关注几个方面:

  1. 分贝
  2. 网络
  3. 应用层
  4. 记忆

监控数据库很简单,使用RDBMS监控工具(如DB2的查询监视器)或其他东西,具体取决于供应商。

分析B网络有很多不同的工具,但你需要做的是找出你的延迟和网络速度。

我相信我们可以假设,在你的情况下,网络是好的,或者至少不太可能有问题。

第三个要分析的是你的应用层,这是你需要一个合适的分析工具的地方。你可以使用免费的和jdk一起提供的visualVM,或者你也可以使用付费的工具包。但是你可以得到一个试用版。

您还可以使用分析工具分析内存。

执行CPU采样后,您将能够找出应用程序的哪些区域导致了延迟。Yourkit还能够从应用层监控已执行的SQL。这样,您将在一个度量中获得SQL执行速度、延迟和传输结果集的时间。

常见的性能调整选项有:

冬眠。使用批处理加载集合,不要加入关系,而是支持 FetchStrategy.SELECT。

确保你没有做任何笛卡尔积之类的运算。

孟正志
2023-03-14

这种延迟可能有许多原因,下面列出了一些最常见的原因。

  1. 线程正在等待锁定。
  2. 数据库性能问题。
  3. CPU 密集型任务。
  4. 网络延迟

在您的情况下,可以排除Web服务器和客户端之间的网络延迟,因为您提到静态页面和CSS等页面资源的服务器响应时间以毫秒为单位。

对于其他事情,像VisualVM这样的远程管理系统是找出是什么导致了延迟以及哪个进程占用了大量CPU时间的最佳工具。您也可以使用JProfiler这样的商业分析器,但是VisualVm也可以很好地完成这项工作。

要连接到 ViusalVM,您需要有权访问您的服务器,并在JAVA_OPTS或选项所在的任何位置添加 JMX 选项,然后重新启动 Web 应用程序。

等待锁定的线程 - 可能有一段代码,其中有一个锁定静态字段的同步方法。如果该方法假设处理数据库查询大约需要 5 秒钟。有10个请求排队。然后,最后一个请求将在 50 秒或更长时间内得到处理。

如何检测这种瓶颈情况?

您可以浏览代码并找出所有获取锁的位置,并添加一些调试日志。但是,如果问题不在您的代码中,并且可能由某些第三方库引起,该怎么办?

我曾经遇到过一种情况,即当日志文件滚动更新时,Logger(log4j库)会阻塞所有线程(大约10秒)。通过代码审查无法检测到这种情况。

探查器来营救。VisualVM可能是检测线程锁定引起的延迟的最佳探查器。这是你能做的。

  1. 监视线程。
  2. 当您看到许多线程处于阻塞状态时。
  3. 采用线程转储。
  4. 分析线程转储以查看导致此问题的函数并相应地解决问题。

CPU密集型任务-如果一个进程占用大量CPU时间,它也可能导致延迟。同样,您可以使用VisualVM的采样器,找出占用CPU时间最多的线程。

希望这能帮助您找到延误的原因!

 类似资料:
  • 我有以下代码运行在野飞8.0.0.最终: write和update方法都被并行调用,因为它们直接从另一个处理HTTP请求的类调用: 一些“write”方法调用是成功的,但有时,当“write”方法被多个线程并行调用时,它开始挂起em.persist(entity)。 在PostgreSQL server端,我可以看到事务处于“idle in transaction”状态,查询为:“select n

  • 我想从詹金斯那里向wildfly部署一个war文件。我尝试了很多方法,但都不管用 我使用了将WAR/EAR部署到wildfly插件,但它对我不起作用,我得到了错误: (致命:无法初始化命令上下文。生成步骤“将WAR/EAR部署到WildFly”将生成标记为失败已完成:失败), 我搜索了那个问题,但给出的答案对我没有帮助。 在我使用将WAR/EAR部署到容器的构建后操作中,它对我也不起作用,我得到了

  • 我有一个web应用程序部署为使用Wildfly的爆炸战争。我想要得到的是 null 目前,我所处的情况是,我可以选择其中一个或另一个,但不能同时获得这两个选项(这意味着,要么每个jsp更改都强制进行新的部署,要么.class文件不强制进行新的部署)。 wildfly的当前配置(使用版本8.1.0)为 此外,我还发现,无论我在deployment-scanner配置中设置了什么,一旦服务器启动并运行

  • 我正在尝试将jboss wildfly 8配置为将Jackson用于JSON。所以我补充说 我的耳朵工程。但在部署时,我会遇到以下错误: 原因:java。lang.LinkageError:加载程序约束冲突:解析重写的方法“org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider$Proxy$\u$$WeldClien

  • 大家好,我正试图使用sqlserver jdbc与野飞AP,但当我试图测试数据源后的连接,我总是得到这个错误: 以下是配置文件的内容: module.xml: 独立的。xml: 最后,我的jdbc jar文件位于以下路径: wildfly-14.0。0.Final\modules\system\layers\base\com\microsoft\sqlserver\main

  • 我正在运行一个Web应用程序,它是一个rest API,我正在使用Wildfly 9.0.2和PostgreSQL。数据库连接使用最新的jdbc4.2驱动程序,jre是oracle的jr8。 我根据这个主题安装了jdbc,并且运行得很好。到目前为止,我使用wildfly管理控制台安装了数据源。 因此,当我尝试插入json字段时,问题出现了。我很快意识到JDBC没有直接的方法来插入json字段,比如