我需要关闭 readWriteTransaction 查询块中的重试。有人可以帮我吗?
我们的应用程序是用Java(Spring boot)编写的,我在创建数据库客户端时尝试使用重试设置,但这对我来说不起作用。
我已经尝试过类似这样的代码-
import com.google.cloud.spanner.Spanner;
import com.google.cloud.spanner.SpannerOptions;
import com.google.cloud.spanner.DatabaseClient;
import com.google.cloud.spanner.DatabaseId;
import com.google.api.gax.retrying.RetrySettings;
import org.threeten.bp.Duration;
//My Bean/Class Definition code here
// Customize RetrySettings to switch off retries.
RetrySettings retrySettings = RetrySettings.newBuilder()
.setMaxAttempts(1) // This ensures no retries.
.build();
// Create SpannerOptions with the custom RetrySettings.
SpannerOptions options = SpannerOptions.newBuilder()
.getSpannerStubSettingsBuilder()
.executeSqlSettings()
.setRetrySettings(retrySettings)
.build();
// Create a Spanner service object.
Spanner spanner = options.getService();
// Get the DatabaseClient.
DatabaseId db = DatabaseId.of("my-project-id", "my-instance-id", "my-database-id");
DatabaseClient dbClient = spanner.getDatabaseClient(db);
// Use the DatabaseClient to run a readWriteTransaction.
dbClient.readWriteTransaction().run(transaction -> {
// My transaction logic here.
return null;
});
但是重试仍然没有以某种方式被关闭。有人可以帮忙吗? 预先感谢。
您介意详细说明一下为什么您想要禁用重试,以及您想要禁用什么类型的重试吗?
尚不完全清楚您要禁用哪种类型的重试。有两件事可以在 Cloud Spanner 客户端库中重试:
ExecuteSql
的单个调用。为此,您的配置原则上是正确的。 但是,Java 客户端库使用 ExecuteStreamingSql
RPC 来执行 查询,并使用 ExecuteSql
RPC 来执行 DML 语句(插入/更新/删除语句)。因此,您的配置将仅阻止重试 DML 语句。TransactionRunner
(如给定示例中所示)时,这种情况会自动发生。如果您确实想禁用读/写事务的重试,则可以使用 TransactionManager
代替(请参阅 https://github.com/googleapis/java-spanner/blob/078b7ca95548ac984c79d29197032b3f813abbcf/google-cloud-spanner/src /main/java/com/google/cloud/spanner/DatabaseClient.java#L459)。但请注意,此选项适用于高级用例,例如用于实现您自己的驱动程序。