FMDB 在操作庞大数据时的线程问题

首先  数据库插入的规则:   上一条操作执行完后  下一条操作才能执行

如果在数据库操作的数据比较庞大的时候  主线程 会卡  (运行特别慢)  解决方式:

给数据库添加子线程

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
        for (int i = 0; i < 1000; i++) {
             [[FMDBManager sharedIntance] insertTableNameWIthTableName:@"Dota" name:@"lasy" gender:@"f" age:@"12" image:UIImagePNGRepresentation([UIImage imageNamed:@"2.jpg"]) myID:@"5"];

}

});

但添加子线程后 如果多个子线程在 异步 操作时 会导致程序 Crash  解决方式:  用 block 队列操作  代码如下:

#注意: 如果NSOperationQueue 是局部的 每执行一次都会有一个不同的 block 队列在执行 顾添加成属性的NSOperationQueue 对象

self.queue = [[NSOperationQueue alloc] init];

NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{

for (int i = 0; i < 1000; i++) {

[[FMDBManager sharedIntance]

insertTableNameWIthTableName:@"Dota"name:@"lasy"gender:@“女"age:@"12"image:UIImagePNGRepresentation([UIImageimageNamed:@"2.jpg"]) myID:@“2”];

}

}];

NSBlockOperation *block2 = [NSBlockOperation blockOperationWithBlock:^{

for (int i = 0; i < 1000; i++) {

[[FMDBManager sharedIntance] insertTableNameWIthTableName:@"Dota" name:@"sony" gender:@“男" age:@“22" image:UIImagePNGRepresentation([UIImage imageNamed:@“3.jpg"]) myID:@“1"];

}

}];

[self.queue addOperation:block1];

[self.queue addOperation:block2];

感觉这样确实能解决 多个子线程在 异步 操作时的问题了 但实际上在运行时 还是会 Crash 的, 那该怎么办呢?

即便使用了 FMDB 第三方

添加属性的 NSOperation 的 对象  在 viewDidLoad 中初始化  并设置他的最大并发执行次数 代码如下 :

[self.queue setMaxConcurrentOperationCount:1];

这样问题就解决了

时间: 2024-10-22 01:27:15

FMDB 在操作庞大数据时的线程问题的相关文章

多用户操作一个数据表时的并发性操作

事务处理(多用户同时操作一条信息时是用-并发) 在c/s或多层中,如果两个用户同时打开一条记录,修改后提交会产生更新冲突: 据说办法有二:1.打开同时锁定表的记录 2.浦获错误,撤消其中一个用户的修改,但是很少见到具体实现的代码:请大家告诉具体的代码怎么写: 1.打开时如何锁定一条记录? 2.如何扑获更新错误?在delphi中调试时会报“该记录读出后已经被再次修改”,而在运行时如何判定错误为更新冲突?因为更新时其他的错误如输入不合法等也可能报错,如何把更新冲突和其他的分开? ==========

启动时创建线程并传递数据

原文地址:https://msdn.microsoft.com/zh-cn/library/ts553s52(v=vs.110).aspx 将数据传递给线程和从线程检索数据 在 .NET Framework 2.0 版中,ParameterizedThreadStart 委托提供了一种简便方法,可以在调用 Thread.Start 方法重载时将包含数据的对象传递给线程. 有关代码示例,请参见 ParameterizedThreadStart. 使用 ParameterizedThreadStar

ThreadLocal遇到线程池时, 各线程间的数据会互相干扰, 串来串去

最近遇到一个比较隐蔽而又简单地问题,在使用ThreadLocal时发现出现多个线程中值串来串去,排查一番,确定问题为线程池的问题,线程池中的线程是会重复利用的,而ThreadLocal是用线程来做Key的所以在使用线程池的时候要特别注意ThreadLocal. ThreadLocal数据是在线程创建时绑定在线程上的, 所以解决方法是在使用数据之前调用remove() 移除掉之前的其他线程产生的数据 解决方法 重构remove方法 @Override public void remove() { 

操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误

操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误,如下图所示: 出现的原因是由于,在插入字符或字符串型字段时.如果插入的数据是纯数字,则不会有错误:如果出现字符,则会报ORA-00984列在此处不允许异常. 可以创建TestUser表,如下: create table TestUser ( usercode char(5), username varchar2(20) ) 以下例子请注意第一个字段usercode的值 1.正常例子:usercode为纯数字.可以正常插

关于CoreData和SQLite多线程访问时的线程安全问题

http://www.jianshu.com/p/95db3fc4deb3 关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常用的两种数据持久化存储方式:CoreData和SQLite,两者都需要设置线程安全,在这里以FMDB来解释对SQLite的线程安全访问. 一:FMDB的线程安全:(以读取图片为例) 1.没有线程安全的执行方式: //****

CoreData和SQLite多线程访问时的线程安全

关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常用的两种数据持久化存储方式:CoreData和SQLite,两者都需要设置线程安全,在这里以FMDB来解释对SQLite的线程安全访问. 一:FMDB的线程安全:(以读取图片为例) 1.没有线程安全的执行方式: //************** 数据库保存图片 ******************/

蓝的成长记——追逐DBA(3):古董上操作,数据导入导出成了问题

蓝的成长记--追逐DBA(3):古董上操作,数据导入导出成了问题 ***************************************声明*************************************** 个人在oracle路上的成长记录,其中以蓝自喻,分享成长中的情感.眼界与技术的变化与成长.敏感信息均以英文形式代替,不会泄露任何企业机密,纯为技术分享. 创作灵感源于对自己的自省和记录.若能对刚刚起步的库友起到些许的帮助或共鸣,欣慰不已. 欢迎拍砖,如有关技术细节表述有错

servlet的生命周期与运行时的线程模型

第 14 章 生命周期 注意 讲一下servlet的生命周期与运行时的线程模型,对了解servlet的运行原理有所帮助,这样才能避免一些有冲突的设计. 如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章:第 15 章 分页. 了解servlet的生命周期. 了解servlet运行时的线程模型,及设计程序时需要注意的部分. 14.1. 生命周期 我们之前使用的都是javax.servlet.http.HttpServlet,这个类实现了javax.servlet.Servlet

好程序员分享大数据教程之线程高级部分

好程序员分享大数据教程之线程高级部分,首先讲一下线程的生命周期 对于一个线程, 在被创建后, 不是立即就进入到了运行状态, 也不是一直处于运行状态, 在线程的声明周期中, 一个线程会在多种状态之间进行切换 new : 新生状态, 线程被实例化, 但是还没有开始执行(start) runnable: 就绪状态, 已经执行过start, 线程已经启动了, 只是没有抢到CPU时间片 running: 运行状态, 抢到了CPU时间片 blocked: 阻塞状态, 线程执行的过程中, 遇到一些特殊情况,