微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – MySQL BLOB图像数据逐渐丢失?

mysql中,MyISAM类型表有一个Image类型为mediumblob并存储捕获的图像.我得到了一些有趣且有问题的图像.一些图像逐渐丢失数据.

Field          type  
--------------------------
image         mediumblob

my.ini max allowd packet size set max_allowed_pa​​cket = 8M

这就是问题

当C#应用程序每次从服务器获取数据时,这些图像逐渐丢失数据并随机大小.我在100000个图像数据中得到了10-12个这样的坏图像.

这种行为可能是什么原因?任何人都有任何想法/解决方案如何解决/避免这个问题.

更新1:
从PictureBox读取字节

MemoryStream ms = new MemoryStream();
byte[] ret = null;

try
{
     pictureBox.Image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
     byte[] Data = new byte[ms.Length];
     ms.Read(Data,(int)ms.Length);
     ret = byteData;
     ms.Close();
 }         

将bytes数组保存为数据库作为中等blob数据.从数据库中检索数据时,我正在转换读取器数据

byte[] Data = (byte[])reader["Image"];
最佳答案
罪魁祸首是MyISAM存储类型.

我们使用InnoDB存储来存储一百万个图像并进行压力测试,我们得到了正确的结果.由于InnoDB符合酸性,因此无法正确检索文件或完全没有检索到文件(小于0.01%).

当我们转移到MyISAM时,故障率增加到20%,有损数据和您的情况一样.原因是,MyISAM使用表锁,因此当写入正在进行时,整个表被锁定,并且在超时的情况下,它会覆盖导致数据丢失的事情.

我们现在已经将所有内容都转移到了MS sql,因为InnoDB运行良好,但它仍然没有重复使用已删除文件空间,因此InnoDB不断增长. MS sql express限制为10gb,因此我们创建了4-8gb的页面,并在那里存储blob.我们有自己的自定义复制,通过网络使用相同的配置在三台服务器上复制文件.

由于许多原因,将文件存储在磁盘上是不好的,每个人都在说文件系统是为高性能设计的,并且可以存储数百万个文件,但事实并非如此,当你有超过10万个文件时,驱动器无法更快地执行.它们在一个文件和1000个较小文件中表现良好.目前我们存储了1000万个文件并将其存储在db中更有意义,因为db对查询进行了优化并且执行了良好的缓存.您可以在http://akashkava.com/blog/127/huge-file-storage-in-database-instead-of-file-system/阅读更多内容

这就是MongoDb,Hadoop,Azure Blob Store,haystack和Amazon S3发明的确切原因.

原文地址:https://www.jb51.cc/mysql/433263.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐