天天看點

MongoDB的TruncationException異常解決方法

近期由于DB4O的一些無解的BUG,導緻現行的項目查詢效率底下,于是憤而遷移到了MongoDB。

MongoDB雖然比DB4O的使用者要多一些,但是文檔依然極度匮乏,遇到問題不是那麼容易就能搜到解決辦法,在此分享一個遇到的比較要命的異常問題的修正辦法。

我的項目使用的是C#版官方驅動,運轉一直良好,今天在通路期間突然就出現了這樣的異常,并且無論怎麼重新整理都無法恢複:

MongoDB.Bson.TruncationException: Truncation resulted in data loss. [TruncationException: Truncation resulted in data loss.]     MongoDB.Bson.Serialization.Options.RepresentationSerializationOptions.ToSingle(Double value) +339     MongoDB.Bson.Serialization.Serializers.SingleSerializer.Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options) +257     MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeMemberValue(BsonReader bsonReader, BsonMemberMap memberMap) +342 [FileFormatException: An error occurred while deserializing the Money property of class MongoModels.User: Truncation resulted in data loss.]     MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeMemberValue(BsonReader bsonReader, BsonMemberMap memberMap) +878     MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options) +1343     MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options) +247

任何讀取到使用者資料的頁面都會報這個錯誤,完全無法正常使用網站了。

注意錯誤提示中我标注的紅色内容位置,問題就可以定位到User類的Money屬性上:

這屬性很簡單,就是個float類型的數字而已,怎麼會出錯呢?

用MongoVUE檢視資料庫的User集合,完全正常,隻是這個Money值由于是浮點數,會有一定的誤差,導緻小數位數非常長。

直接搜尋"Truncation resulted in data loss"無果,輾轉找到了一個類似的問題解答:

<a href="http://stackoverflow.com/questions/5314238/how-do-i-set-the-serialization-options-for-the-geo-values-using-the-official-10g" target="_blank">http://stackoverflow.com/questions/5314238/how-do-i-set-the-serialization-options-for-the-geo-values-using-the-official-10g</a>

按照解答者提供的方法進行嘗試:

果然一切正常了,看來主要是要顯式聲明允許驅動程式截斷浮點類型的多餘位數。

這真是純坑爹的設計,初期不強制聲明,運作期間需要截斷時才報錯,定時炸彈一樣兇殘。

看來像decimal、float、double這種浮點型資料都應該顯式進行此聲明,否則就會留下嚴重隐患。

本文轉自斯克迪亞部落格園部落格,原文連結:http://www.cnblogs.com/SkyD/p/3960057.html,如需轉載請自行聯系原作者