![](/img/trans.png)
[英]Best way for handle Read HTTPRequst post data on Restful api
[英]Best way to handle read timeouts in Spring Data MongoDB
因此,我们不时看到如下异常:
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对象设置不同的可选连接参数。 您正在设置心跳频率,以确保驾驶员重试连接。 还要设置套接字超时,以确保它不会持续太长时间。
为避免过多的代码重复,您可以选择遵循以下某些模式。 基本思想是避免在项目中到处乱扔任何与数据库连接相关的配置。
/**
* 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中实现所有数据库操作,以全面引入一些常用功能。 例如,为所有“插入”添加日志记录
Spring retry project是处理重试的众多选项之一
https://github.com/spring-projects/spring-retry
它为Spring应用程序提供了声明式重试支持。 这基本上是Spring对这个问题的答案。 它用于Spring Batch,Spring Integration,Spring for Apache Hadoop(以及其他)。
如果您不仅想解决MongoDB的超时问题(及相关问题),还想解决其他外部参考的问题,则应尝试使用Netflix的Hystrix( https://github.com/Netflix/Hystrix )。
这是一个很棒的库,可以很好地与RX和异步处理集成在一起,最近它变得越来越流行。
如果我没记错的话,我认为当您尝试建立连接或只是在连接池中做好准备时,您需要配置超时等属性。 或者,您可以只检查网络或计算机,然后将请求数据分割更多次以减少网络传输时间
https://github.com/Netflix/Hystrix是您处理依赖性的工具。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.