繁体   English   中英

Restful Webservices使用Java,Apache Axis2,Hibernate和MySQL及其性能

[英]Restful Webservices using Java, Apache Axis2, Hibernate and MySQL and its performance

我在应用程序中阅读了某些地方使用的webservcies。 经过大量的研究,我能够创建一个Web服务,它将接受Json和JsonP两种格式作为请求和响应。 我使用Java,Apache Axis2,Hibernate和MySQL作为数据库开发了webservcies。 问题很少,我不知道如何解决?

  1. 插入或删除选项,有时如果一次超过两个用户调用插入或删除查询进入睡眠模式的任何行的服务,下次有人尝试获取他无法获取的服务。 根据服务器日志记录,它说错误SQL锁定状态。 如果我在MYSQL中检查Processlist它在Sleep中显示该查询,我必须杀死才能恢复。

  2. webservice的性能似乎没有达到标记,它需要时间更多的时间,因为我所经历的不应该。 简单来说,如何通过服务获得更好的性能

  3. 如何实现安全功能,以便在用户登录时,可以为他/她提供id并验证该id,以便可以防止未经授权的访问

或者只是指导我可以使用Java最合适和最优化的Web服务方法

对此问题的回答并非针对Android。 以下是我的调查,可能对您有用。

关于MySQL连接进入睡眠模式的问题,您可以执行以下操作。

  • 调试Hibernate使用的数据源,尝试增加池大小并检查其中的任何问题。
  • 定义连接的超时时间。 JBoss有几个与此相关的配置,如blocking-timeout-millisidle-timeout-minutes等。
  • 声明一种机制,以定期验证池中的连接资源的活动性。 您可以浏览OracleStaleConnectionChecker以获取选项。
  • 在池中配置miniumn连接。 这很重要,因为当丢弃所有过时的连接时,需要预先填充空池并准备好活动连接。

为了执行插入/删除操作和SQL锁定状态,请尝试在每次请求时重新排序您要触发的查询序列。 这可能不是死锁情况,但正确排序DB查询肯定会导致更少的锁定时间和更好的性能。

这个答案可能对您有用。 Hibernate:尝试获取锁定时发现死锁

您开发的Web服务可能需要进行一些性能优化才能使其达到标准。 以下是您可以采取的最初几个步骤,以提高性能。

  • 避免嵌套循环。 迭代欲望中的每个额外参数都以指数方式增加lopp的阶数。
  • 删除对象的早期初始化。 这可能导致长时间不需要的GC循环。

除了上述优化之外,您还可以使用多种框架和工具来评估代码质量及其性能。 PMD,FindBugs,JMeter,Java profiler是其中的一小部分。

Shishir

您将不得不分析您的服务器并查看花费的时间。 我非常喜欢YourKit来做线程配置文件。 JDK附带的visualvm也可以提供帮助。

您的Web服务可能很慢的原因有很多种:

  • 从客户端到服务器的延迟
  • 处理服务器上的HTTP请求
  • 处理客户端上的HTTP响应
  • 进行数据库调用(听起来你已经有某种锁定/阻塞)

你将不得不得到标记来告诉你从A到B到C到D需要多长时间才能回到C回到B回到某种程度。 我们会从这里大量猜测你的程序到底发生了什么,但是我们可以给你一些想法/工具来解决它。

如果您使用YourKit,请将其连接到您的服务器进程。 没有其他任何东西连接到您的服务器(例如您的客户端没有发送请求)。 尝试与客户端请求,您应该看到您的接受线程接收HTTP请求,然后委托您的处理线程或自己处理。 您可以使用YourKit查看在该通话时间内在不同功能上花费的时间。

尝试与您的客户打电话。 尝试使用像wget这样的简单HTTP请求工具,或者你的IDE有一个web服务测试工具(例如intellij),或者你可以下载一个简单的HTTP测试工具。

通过在只输出响应的简单工具中对其进行测试,您可以消除任何客户端处理问题。 您还可以在Chrome或Firefox中实现类似的测试,并使用开发人员工具查看完成请求的时间。

根据我的经验,处理请求和委托的框架可能会引入一些性能问题。 我因为性能问题而将Grails从生产环境中剥离出来(在任何Grails / Groovy火焰出现之前,我们的运行速度远高于典型的Web应用程序,我相信Grails在最后一对中取得了一些进展多年......唉,当时不适合我的需要)

顺便说一句,我怀疑你是在操作一个负载,你将批评你选择使用的Web服务框架。 我对Spring MVC和DropWizard(Jersey JAX-RS)感到满意,Grails也很容易使用。

您应该在Web服务中进行简单的静态内容响应,并查看返回与发出数据库调用的请求的速度。

另外,你在MySQL中使用什么样的表? InnoDB的? MyISAM数据? 他们有不同的锁定方案。 这可能会导致您的MySQL问题。

所有这一切的关键,将问题分解成部分,并逐个测量每个部分并逐个消除部分,直到你去,每次我做X它都比较慢(就像每次我使数据库调用它的速度慢)

在Java中,您可以通过文档/论坛在线找到更多支持的方式是使用Spring MVC将Web服务开发为REST Web服务。

您可以基于此资源并从那里获取它:

使用Spring,您可以轻松创建RestFul Web服务,spring可以完成您所需的所有基础工作。 正如其他人所提到的,您可以在任何类型的客户端中使用Web服务 - 包括Android。

这里有详细的指南: https//spring.io/guides/gs/rest-service/

以下是我的建议:

  1. 使API仅读取或写入数据库。 如果API结合了读写,则可能导致死锁;
  2. 使用轻量级HTTP服务器。 功能强大的HTTP服务器可能会消耗更多。
  3. 利用线程。 当您面对大量用户时,有更多线程可能会有所帮助。
  4. 让更多东西变得静止。 您可以避免不必要的查询。

我认为mhoglan的答案足够详细。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM