gpt4 book ai didi

java - 在 Spring Data MongoDB 中处理读取超时的最佳方法

转载 作者:IT老高 更新时间:2023-10-28 13:16:10 27 4
gpt4 key购买 nike

所以我们不时会看到这样的异常:

java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at org.bson.io.Bits.readFully(Bits.java:48)
at org.bson.io.Bits.readFully(Bits.java:35)
at org.bson.io.Bits.readFully(Bits.java:30)
at com.mongodb.Response.<init>(Response.java:42)
at com.mongodb.DBPort$1.execute(DBPort.java:141)
at com.mongodb.DBPort$1.execute(DBPort.java:135)
at com.mongodb.DBPort.doOperation(DBPort.java:164)
at com.mongodb.DBPort.call(DBPort.java:135)
at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:292)
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:271)
at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:84)
at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:66)
at com.mongodb.DBCollection.findOne(DBCollection.java:870)
at com.mongodb.DBCollection.findOne(DBCollection.java:844)
at com.mongodb.DBCollection.findOne(DBCollection.java:790)
at org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2000)

在代码中处理这些问题并从中恢复的最佳方法是什么?我们是否需要在每个 mongodb 调用周围“重试”?

最佳答案

您可以使用 MongoClientOptions 对象来设置不同的可选连接参数。您正在考虑设置心跳频率以确保驱动程序重试连接。还要设置套接字超时以确保它不会持续太久。

  1. MinHeartbeatFrequency:如果驱动程序必须频繁地重新检查服务器的可用性,它将至少等待上次检查后的这段时间,以避免浪费精力。默认值为 10 毫秒。
  2. HeartbeatSocketTimeout:心跳检查超时
  3. SocketTimeout:连接超时

Reference API

为避免过多的代码重复,您可以选择遵循下面给出的一些模式。基本思想是避免在项目中到处乱扔任何与数据库连接相关的配置。

/**
* This class is an abstraction for all mongo connection config
**/
@Component
public class MongoConnection{

MongoClient mongoClient = null;

...

@PostConstruct
public void init() throws Exception {
// Please watch out for deprecated methods in new version of driver.
mongoClient = new MongoClient(new ServerAddress(url, port),
MongoClientOptions.builder()
.socketTimeout(3000)
.minHeartbeatFrequency(25)
.heartbeatSocketTimeout(3000)
.build());
mongoDb = mongoClient.getDB(db);
.....
}

public DBCollection getCollection(String name) {
return mongoDb.getCollection(name);
}
}

现在你可以在 DAO-s 中使用 MongoConnection

@Repository
public class ExampleDao{

@Autowired
MongoConnection mongoConnection;

public void insert(BasicDBObject document) {
mongoConnection.getCollection("example").insert(document);
}
}

您还可以在 MongoConnection 中实现所有数据库操作,以全面引入一些通用功能。例如为所有“插入”添加日志记录

关于java - 在 Spring Data MongoDB 中处理读取超时的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27829866/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com