Chúng tôi đang sử dụng các chức năng suối trong RavenDB để tải, chuyển đổi và di chuyển dữ liệu giữa 2 cơ sở dữ liệu như vậy:RavenDB Suối cho kết quả bị chặn - Kết nối Khả năng phục hồi
var query = originSession.Query<T>(IndexForQuery);
using (var stream = originSession.Advanced.Stream(query))
{
while (stream.MoveNext())
{
var streamedDocument = stream.Current.Document;
OpenSessionAndMigrateSingleDocument(streamedDocument);
}
}
Vấn đề là một trong những bộ sưu tập có hàng triệu hàng, và chúng tôi tiếp tục nhận được một IOException
theo định dạng sau:
Application: MigrateToNewSchema.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.IOException
Stack:
at System.Net.ConnectStream.Read(Byte[], Int32, Int32)
at System.IO.Compression.DeflateStream.Read(Byte[], Int32, Int32)
at System.IO.Compression.GZipStream.Read(Byte[], Int32, Int32)
at System.IO.StreamReader.ReadBuffer(Char[], Int32, Int32, Boolean ByRef)
at System.IO.StreamReader.Read(Char[], Int32, Int32)
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ReadData(Boolean, Int32)
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ReadStringIntoBuffer(Char)
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ParseString(Char)
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ParseValue()
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ReadInternal()
at Raven.Imports.Newtonsoft.Json.JsonTextReader.Read()
at Raven.Json.Linq.RavenJObject.Load(Raven.Imports.Newtonsoft.Json.JsonReader)
at Raven.Json.Linq.RavenJObject.Load(Raven.Imports.Newtonsoft.Json.JsonReader)
at Raven.Json.Linq.RavenJToken.ReadFrom(Raven.Imports.Newtonsoft.Json.JsonReader)
at Raven.Client.Connection.ServerClient+<YieldStreamResults>d__6b.MoveNext()
at Raven.Client.Document.DocumentSession+<YieldQuery>d__c`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNext()
at MigrateToNewSchema.Migrator.DataMigratorBase`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MigrateCollection()
at MigrateToNewSchema.Program.MigrateData(MigrateToNewSchema.Enums.CollectionToMigrate, Raven.Client.IDocumentStore, Raven.Client.IDocumentStore)
at MigrateToNewSchema.Program.Main(System.String[])
Điều này xảy ra một cách khá dài vào streaming và tất nhiên các vấn đề kết nối tạm thời sẽ xảy ra trong loại này kỳ (phải mất giờ để hoàn thành).
Tuy nhiên, khi chúng tôi thử lại, vì chúng tôi đang sử dụng Query
, chúng tôi phải bắt đầu lại từ đầu. Vì vậy, cuối cùng nếu có lỗi kết nối trong toàn bộ Stream
thì chúng tôi phải thử lại lần nữa và cho đến khi nó hoạt động kết thúc.
Tôi biết bạn có thể sử dụng ETag
với luồng để khởi động lại hiệu quả tại một thời điểm nhất định, tuy nhiên không có quá tải để thực hiện điều này với Query
mà chúng tôi cần lọc kết quả đang được di chuyển và chỉ định bộ sưu tập chính xác. Vì vậy, trong RavenDB, có cách nào để cải thiện khả năng phục hồi nội bộ của kết nối (thuộc tính chuỗi kết nối, cài đặt nội bộ, v.v.) hoặc có hiệu quả "khôi phục" luồng trên một lỗi không? Không.
tôi đã phát hiện ra [Data Subscriptions] (http://ravendb.net/docs/article-page/3.0/csharp/client-api/data- đăng ký/cách tạo dữ liệu-đăng ký), một tính năng RavenDb 3.0 cung cấp cơ chế đáng tin cậy để lặp qua bộ sưu tập tài liệu phù hợp với tiêu chí đã chỉ định và cho phép bạn dễ dàng tiếp tục từ nơi bạn đã dừng lại. Nếu ai đó sẵn sàng để cùng nhau đưa ra một số mẫu mã cho thấy cách tính năng đó có thể trả lời câu hỏi này, tôi sẽ xem xét điều đó xứng đáng với tiền thưởng. – StriplingWarrior
Bạn có bị ràng buộc với việc sử dụng truy vấn không? Mặc dù nó sẽ không hiệu quả hơn, đây là di chuyển nên bộ nhớ không phải là vấn đề - tại sao không lặp lại bộ sưu tập doc thô và lọc trong bộ nhớ, vì vậy bạn có thể tiếp tục tại Etag? Đây là cách tôi xử lý tất cả các luồng, tôi không bao giờ sử dụng các truy vấn. – kamranicus
@StriplingWarrior Đã một thời gian :-) Tôi không làm việc cho công ty sử dụng RavenDB nữa nhưng điều này vẫn khiến tôi quan tâm vì vậy tôi sẽ đưa ra câu trả lời với mã đăng ký dữ liệu ngày hôm nay –