Bağlantı Esneklik:RavenDB Akış - Öyle gibi 2 veritabanları arasında veri yüklemek dönüştürmek ve göçe RavenDB içinde Akış işlevini kullandığınız
var query = originSession.Query<T>(IndexForQuery);
using (var stream = originSession.Advanced.Stream(query))
{
while (stream.MoveNext())
{
var streamedDocument = stream.Current.Document;
OpenSessionAndMigrateSingleDocument(streamedDocument);
}
}
sorun koleksiyonlarından biri milyonlarca olmasıdır satırların ve biz aşağıdaki biçimde bir IOException
almaya devam:
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[])
Bu akış içine ve geçici bağlantı sorunları dönemin bu tür üzerinde meydana gelecektir elbette oldukça uzun bir yol olur (tamamlanması için saat sürer). Ancak, yeniden denediğimizde, Query
kullanıyor olduğumuzdan, sıfırdan başlamalıyız. Sonuç olarak, tüm Stream
sırasında bir bağlantı hatası varsa, tekrar denemeye ve tekrar bitene kadar tekrar denemeliyiz.
ETag
akışını etkin bir şekilde yeniden başlatmak için belirli bir noktada kullanabileceğinizi biliyorum, ancak aktarılan sonuçları filtrelememiz ve doğru koleksiyonu belirtmemiz gereken Query
ile aşırı yüklenme yok.
Yani, RavenDB'de, bağlantının iç esnekliğini (bağlantı dizesi özelliği, iç ayarlar vb.) Iyileştirmek veya bir hata üzerinde bir akışı etkin bir şekilde "kurtarmak" için bir yol var mı?
ben keşfettim [Veri Abonelikler] (http://ravendb.net/docs/article-page/3.0/csharp/client-api/data- abonelikler/nasıl oluşturulur-veri-abonelik), RavenDb 3.0 özelliği, belirtilen ölçütlerle eşleşen bir belge koleksiyonunda yineleme yapmak için güvenilir bir mekanizma sağlar ve bıraktığınız yerden kolayca almanızı sağlar. Birisi, bu özelliğin bu soruyu nasıl yanıtlayabileceğini gösteren bazı kod örneklerini bir araya getirmeye istekli olsaydı, bu ödülün layık olduğunu düşünürdüm. – StriplingWarrior
Bir sorguyu kullanarak bağlandınız mı? Daha etkisiz olmasına rağmen, bu bir göçtür, bu nedenle hafıza bir sorun değildir - neden ham doküman koleksiyonlarını yineleme ve bellek içi filtreleme, böylece bir Etag'da devam edebilirsiniz? Tüm akışları nasıl ele alıyorum, asla sorgu kullanmıyorum. – kamranicus
@StriplingWarrior Bir süre oldu :-) Artık RavenDB kullanan şirket için çalışmıyorum ama bu hala beni ilgilendiriyor, bu yüzden bugün veri aboneliği koduna bir cevap yazacağım. –