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属性上:

public float Money
        {
            get;
            set;
        }

这属性很简单,就是个float类型的数字而已,怎么会出错呢?

用MongoVUE查看数据库的User集合,完全正常,只是这个Money值由于是浮点数,会有一定的误差,导致小数位数非常长。

直接搜索"Truncation resulted in data loss"无果,辗转找到了一个类似的问题解答:

http://stackoverflow.com/questions/5314238/how-do-i-set-the-serialization-options-for-the-geo-values-using-the-official-10g

按照解答者提供的方法进行尝试:

[BsonRepresentation(BsonType.Double, AllowTruncation = true)]
        public float Money
        {
            get;
            set;
        }

果然一切正常了,看来主要是要显式声明允许驱动程序截断浮点类型的多余位数。

总结

这真是纯坑爹的设计,初期不强制声明,运行期间需要截断时才报错,定时炸弹一样凶残。

看来像decimal、float、double这种浮点型数据都应该显式进行此声明,否则就会留下严重隐患。

时间: 2024-10-07 06:40:59

MongoDB的TruncationException异常解决方法的相关文章

mongodb启动不了解决方法

MONGODB无法启动的解决方法 遇到MongoDB突然无法启动,第一反应是删除mongod.lock.这个文件在MongoDB的数据库目录下,默认是/data/db.这是最常见的问题了,产生原因是MongoDB没有正常结束(比如被kill -9杀掉或是其他意外情况导致中断). 还一些其他情况会导致MongoDB无法启动.本文讨论的无法启动,是指:使用/etc/init.d/mongodb start或是sudo service mongdb start,提示mongodb start/runn

sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class异常解决方法

package com.wzs; import java.lang.reflect.ParameterizedType; public class T1<T> {     private Class classt;     public T1() {         ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();         this.classt = (Class)

Visual studio 调试连接数据库异常解决方法

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接) 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Data.SqlClient.SqlException: 在

SVN Attempted to lock an already-locked dir异常解决方法

Attempted to lock an already-locked dir异常解决方法 eclipse或myeclipse用svn提交的时候报错: Attempted to lock an already-locked dir svn: Working copy 'D:/Program Files/MyEclipse 6.6flex/workspace/emis/WebRoot/emis/emresource' locked org.tigris.subversion.javahl.Clie

数组下标越界异常解决方法

代码: 运行结果下标越界异常: 修改方法: 数组下标越界异常解决方法

virgo服务器中关于&quot;An Import-Package could not be resolved&quot;类的异常解决方法

最近在使用virgo进行开发基本osgi的项目,在环境搭建过程中报得最多的就是异常就是以"An Import-Package could not be resolved"开头的,以自己的理解和实际遇到的问题来看,引起些类异常的原因有二: 第一:环境中引入了不同bundle,名称不一样但是在多个bundle组件中的MANIFEST.MF中的Bundle-SymbolicName的名称一样,当然这种异常会容易找到; 第二:多数为这种情况,就是bundle之间相互引用的包的版本不一样造成.

variable &#39;&#39; of type &#39;&#39; referenced from scope &#39;&#39;, but it is not defined 异常解决方法

最近在做一个功能,通过拼接lamdba表达试来实现的功能,但测试时总是出现一个错误,如下图所示,网上也找不到答案,差点都放弃了.. 如上图图所示,我是想通过一个lamdba表达式(上图的IdField属性)来拼接一个新的lamdba表达式(上图的GetById方法中的exp),当然上面只是演示效果,并不是我实际功能的代码. 总是出现异常,我还特意创建另一个lamdba变量exp2,表达式跟exp一样,然后用exp2就不出错,exp跟exp2我比对过,都是一模一样的,真是百思不得其姐. 当然后面我

Spring学习总结(14)——Spring10种常见异常解决方法

在程序员生涯当中,提到最多的应该就是SSH三大框架了.作为第一大框架的Spring框架,我们经常使用. 然而在使用过程中,遇到过很多的常见异常,我在这里总结一下,大家共勉. 一.找不到配置文件的异常 [plain] view plaincopy org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [com/

OllyICE 调试的程序无法处理异常 解决方法

问题描述 在用OllyICE打开可执行文件时出现如下图所示错误 解决方法 1. 选项 -> 调试设置 , 打开调试选项 2. 切换到 异常 页签 3. 取消勾选 忽略(传递给程序)以下异常: 单步中断 4. 确定保存设置 OK, 重新加载可执行文件, 会出现单步中断, 按F9继续执行即可, 问题解决! 我也不清楚为何这样可以解决, 如果有高手知道原因, 请不吝赐教, 谢谢:)