2012-07-13 86 views
3

我从其他几篇文章中了解到我对JAX-WS web服务的理解,他们不是线程安全的。我的Web服务将被100个客户端调用,我们需要能够处理大约200次交易/秒。JAX-WS web服务线程安全和性能问题

如果我在访问数据库的代码周围引入synchronized关键字,我的web服务将与数据库进行交互以执行它的工作,我基本上将确保一次只有一个线程访问数据库,不知我是否会在这种情况下仍然能够达到所需的吞吐量。在此先感谢您的帮助。

我被告知实际上将数据库访问工作转移到另一个类中,并在方法级别实例化该类,这样我就不需要使用synchronized关键字并仍然实现线程安全。那是对的吗?

回答

2

如果您需要事务和线程安全性,那么您为什么不仅仅使用EJB作为JAX-WS端点?

+0

对不起,我还没有探索过这个选项呢..会马上做到..顺便说一句,使用无状态EJB,您仍然可以以平台不可知的方式向您的客户展示您的Web服务。 – 2012-07-13 17:23:05

+1

从客户的角度来看,它仍然是平台不可知论的。只是端点实例的功能和生命周期会有所不同。基本上把你所有的JAX-WS注释放在一个@Stateless bean上。 http://docs.oracle.com/javaee/6/tutorial/doc/bnbor.html – Chase 2012-07-14 03:47:01

+0

Thx为您的回复@Chase我正在寻找更多沿这些线路的答复..我会检查这一点,并接受您的答案,如果这为我工作... – 2012-07-14 15:44:26

1

我们需要关于应用程序的更多信息。

一般来说 - 对于你描述+数据库访问的情况下的性能,我建议。

  1. 仔细规划数据库 - 指数在可能/是有道理的,使用的意见,等等...
  2. 尝试使用一个数据库,具有良好的锁定机制(每行锁)。这样,当两个请求访问不同的行时,您不会受到整个表锁定的影响。
  3. 让您的交易尽可能短。如果使用EJB - 确保“读取数据”方法的事务范围不是Required或RequiredNew(这可能会导致打开一个事务)。
  4. 如果确实使用同步 - 请小心使用正确的锁定。不要试图自动使用“同步”作为其最简单的代码。考虑在可能的情况下使用ReaderWriterLock。
  5. 考虑在可能的情况下使用缓存,但仔细计划这一点,以便您的流程处理“相关”数据。

从这些方向开始 - 我想你会看到你可以实现你的性能目标。

+0

谢谢@zaske。我将在实施解决方案时考虑这些建议。 – 2012-07-14 15:45:56