如何使线程安全的休息端点

时间:2018-06-25 11:37:38

标签: java web-services

能否请您提出如何在不执行同步方法的情况下使其余端点线程安全的方法?

我面临的问题是

假设我的数据库表中有一些行,如下所示,

table1
id     name    status
---    -----   --------
1      abc     assigned
2      abc     ready
3      abc     ready

以此类推。

现在在我的PUT调用中,请求正文为名称(在这种情况下为abc)。我只是从该表中选择行,并更新如下状态,

从表1中选择id,其中name ='abc'和status ='ready'的顺序为id限制1;

更新table1设置状态=“已分配”,其中id = [来自上方选择查询的id]。

如果多个客户端同时调用该PUT端点,则相同的ID(例如“ 2”)将被返回给两个以上的客户端。要求是同一ID不能发送给多个客户端。

3 个答案:

答案 0 :(得分:3)

我认为您应该将数据库逻辑封装到另一个服务中。然后将此方法设置为“事务处理”。 (如果使用Spring:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html) 您的问题不是关于线程安全的,而是关于事务的。

答案 1 :(得分:2)

只需使用以下查询:

update table1 set status = 'assigned' where name = 'abc' and status = 'ready'

答案 2 :(得分:0)

您的池化JDBC连接是单线程的。您需要担心锁定和隔离。

将数据库连接的隔离级别设置为SERIALIZABLE。这将是性能最低的设置,但可以保证不会进行脏读。

要考虑的另一个选择是非阻塞IO。典型的Java HTTP侦听器将HTTP请求传入时排队,由侦听器池处理。如果负载很重,阻塞出队将一直等待,直到释放一个侦听器来处理下一个请求为止。

您可以使用Netty或vert.x编写自己的NIO侦听器。传入的请求由单个线程串行处理,然后将它们放到事件总线上进行处理。