Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建线程安全的rest端点_Java_Web Services - Fatal编程技术网

Java 如何创建线程安全的rest端点

Java 如何创建线程安全的rest端点,java,web-services,Java,Web Services,您能否建议如何使rest端点线程安全,而不将该方法作为同步方法 我面临的问题是, 假设我在数据库的表中有一些行,如下所示 table1 id name status --- ----- -------- 1 abc assigned 2 abc ready 3 abc ready 等等 现在在我的PUT调用中,请求主体是名称,即本例中的abc。我只是从该表中选择行并更新如下状态 从表1中选择id,其中name='abc

您能否建议如何使rest端点线程安全,而不将该方法作为同步方法

我面临的问题是,

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

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

现在在我的PUT调用中,请求主体是名称,即本例中的abc。我只是从该表中选择行并更新如下状态

从表1中选择id,其中name='abc'和status='ready'按id限制1排序

更新表1设置status='assigned',其中id=[id从上面选择查询]


若多个客户端调用将端点放在同一时间,则同一id表示2将返回给两个以上的客户端。要求相同的id不能发送到多个客户端

只需使用以下查询:

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

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

将数据库连接的隔离级别设置为可序列化。这将是性能最低的设置,但它将保证没有脏读或写

另一个选择是非阻塞IO。典型的JavaHTTP侦听器在HTTP请求进入时将其排队,由侦听器池处理。如果负载很重,阻塞出列将等待侦听器释放以处理下一个请求


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

我认为您应该将DB逻辑封装到另一个服务中。然后使此方法具有事务性。如果使用Spring: 你的问题不是关于线程安全,而是关于事务