cursorwindow数据库并发读写

现在有一个listview,绑定一个adapter,在adapter里根据position,用cursor去获取数据库中一个表TB的数据,假设表中有200行数据。屏幕可以显示10行listview的item,现在滑到了list底部,这个时候还有一个按钮,按下的时候开启一个新线程1,在这个新线程里删掉了表TB最末尾20行数据,
于是在线程1里用Message传一个消息,
让UI主线程里的handler去更换cursor,调adapter的notifydatasetchanged(),更新listview,

那么问题来了,如果在线程1里,删掉数据后,传递消息前,我向上滑了一下listview
那么这个时候会调用adapter的getview,position为200-10=190,调用cursor的movetoposition(190),然后getString();

此时,cursorwindow里数据只有0-179条数据,但我却请求了第190条数据,会引发一个cursorwindow的异常,大概是can not get row 190 in a cursor window of 180 rows.
要怎么避免这个异常,或者怎么做到及时更新我的cursor或cursorwindow呢?

0

4个回答

如果游标方式显示listview,那就不能增删数据,如果有增删数据,那就把数据查出来,放到list或者map中,再通过adapter进行显示。

0
danielinbiti
danielinbiti 回复cwhfjcy: 分页获取数据
接近 4 年之前 回复
u011453773
梦里茶 如果数据量太大,一次性加载到内存里,内存占用太大,该怎么破?
接近 4 年之前 回复

为什么会有这种情况发生,在线程里删掉数据后,马上用handle发送消息到主线程更新,前后就几行代码的执行时间,你可以在这段极其微妙的时间差操作?再说了,既然是在界面上显示的,那么数据就已经读到内存中了,你无论怎么getview都是读的内存数据,只有在调用notifydatasetchanged才会刷新内存呢。

0
u011453773
梦里茶 然后getView是用cursor去读数据的,而cursor读的数据不一定是内存里的,具体可以看看cursorwindow的机制……
接近 4 年之前 回复
u011453773
梦里茶 实际应用里,如果数据量很大,主线程更新也可能花一定的时间的
接近 4 年之前 回复
u011453773
梦里茶 点完按钮后,我滑了listview,这个时候,就有可能会在主线程更新前去读旧的cursorwindow,就会出现前面的情况
接近 4 年之前 回复
u011453773
梦里茶 点了一下按钮,然后让那个线程先sleep1s,再开始删数据,
接近 4 年之前 回复
u011453773
梦里茶 关于时间差的问题,可以是这样的:
接近 4 年之前 回复

要么使用对象锁,要么使用Blockingqueue

0

在执行moveToPosition()或者写DB的操作时都要请求锁吗?

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
SQLite数据库的cursor在Android系统Java层及JNI层的实现机制
SQLite
java-并发读取数据库
List<Map<String, Map<String, String>>> data = new ArrayList<>(13); //线程池 ExecutorService threadPool = Executors.newFixedThreadPool(5);
sqlite3 解决并发读写冲突的问题
1 #include "stdafx.h" 2 #include "sqlite3.h" 3 #include 4 #include 5 6 //sqllite 相关变量 7 sqlite3 *sql_db; 8 char *sql_ErrMsg; 9 int sql_rc; 10 sqlite3_stmt *sql_statement; 11 12
Android 中SQLite进行读写时,涉及的并发处理问题
相信做Android开发牵扯到SQLite数据库的时候,我们都知道数据库的CRUD都是不支持多线程操作的。当我们要使用多线程的时候,基本上就是为每个线程分配一个SQLiteOpenHelper对象来进行操作,但这样就会产生很大的性能问题,消耗更多的内存空间。 在这种情况下,我们一般就会只使用一个SQLiteOpenHelper对象来操作,如果我们要使用多线程,这时就需要注意SQLiteDataB
Sqlite3并发读写注意事项
sqlite3的锁及事务类型sqlite3总共有三种事务类型:BEGIN [DEFERRED /IMMEDIATE / EXCLUSIVE] TRANSCATION,五种锁,按锁的级别依次是:UNLOCKED /SHARED /RESERVERD /PENDING /EXCLUSIVE。当执行select即读操作时,需要获取到SHARED锁(共享锁),当执行insert/update/delete操
Android开发笔记之:深入理解Cursor相关的性能问题
当数据库中存有大量数据的时候,用Cursor查询时要注意,有可能引发性能问题。数据库查询出来的Cursor都会由一个CursorWindow来进行数据管理,包括内存空间的申请和数据的填充。CursorWindow对Cursor中的内容大小有限制,限制为1024*1024也就是1M,换句话说Cursor中数据的大小不能超过1M,如果超过1M会引发如下的错误: 复制代码 代码如下: 08-
mysql 并发读写
开发多用户、数据库驱动的应用时,最大的一个问题是:一方面要最大程度地利用数据库的并发访问,另外一方面还要确保每个用户能以一致的方式读取和修改数据。因此就有了锁机制。这也是数据库系统区别与文件系统的一个关键特性。
C#使用读写锁解决SQLITE并发异常问题
使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题。 SQLite是文件级别的数据库,其锁也是文件级别的:多个线程可以同时读,但是同时只能有一个线程写。Android提供了SqliteOpenHelper类,加入Java的锁机制以便调用。但在C#中未提供类似功能。 作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标。 [co...
解决高并发(数据库锁机制)
这篇文章介绍的特别好 https://www.cnblogs.com/lpyan/p/5607669.html
高并发读写压力如何处理?redis内存数据库使用场景引发的思考
redis内存数据库使用场景 内存数据库与关系型数据库在使用上场景如何确定? 问题分析 关系型数据库:提供安全可靠的数据存储操作、高并发读时性能不佳; 内存数据库:提供高效的读操作、高并发写时性能不佳; 使用场景 1. 商品信息:特点是高并发读,可以使用内存数据将商品信息缓存以提高商品信息的读能力; 2.订单处理:特点是高并发写,可以使用消息队列MQ来缓冲高并发写的压力;
从源码看ANDROID中SQLITE是怎么通过CURSORWINDOW读DB的
从源码看ANDROID中SQLITE是怎么通过CURSORWINDOW读DB
mysql 读写高并发大数据表优化
1.更新频繁尽量使用innode引擎,支持行级锁,降低锁粒度,提高并发量。 2.考虑使用mysql 主从做读写分离,可以利用主库更新,从库进行查询。分担数据库压力,提高并发。 3.考虑使用reids nosql类内存数据库进行读写分离。查询通过先redis查询,无结果再查询mysql,同时将mysql数据库查询存入redis。 4.利用mysql表分区(1-1024),减小表粒度,块式管理数
Redis并发写入(乐观同步方法)
一,什么是乐观同步 乐观同步是在取出一个数据A的时候,会携带一个取出时的版本信息,比如:1,而如果在操作的时候,有另外一个操作B把存储在Redis中的数据修改了,那个redis中的数据版本就会加1,这个时候如果再写入A的数据,发现A携带的版本与redis储存的不一样了,这时,redis就判定本次写入失败。 二,redis的事务机制 redis提供了一个事务操作的机制,MULTI 命令用于开...
bdb 性能测试
berkleydb test. 1m 数据. 写5m row , 5m/1657878ms ,30000 row/s . 读:getByHost, 2803 row , 34508ms . 5m 数据写5m row , 5m /17689168 ms , 282row /s. 读:getByHost, 5287row , 133616 ms 10m 数据写 1k row,...
对Access数据库的并发(异步)访问控制和测试
现实工作中有时会需要对Access数据库进行并发(异步)访问。比如,如果有多台打印机同时打印发票,发票号码是从Access数据库中取得的。由于不应重复使用发票号码,所以取发票号码这个操作需要并发(异步)控制。在这里,我用 生成连续的整数 来代替 需要并发(异步)控制的操作(比如,取发票号码)。存储连续整数的表:temp1(co1 int)并发(异步)控制使用的表:exclude(Gen
并发操作Sqlite3
1. Sqlite3可以设置脏读模式,在一个线程写数据的同时另一个线程可以读数据。设置方法:http://blog.csdn.net/u011726005/article/details/76944684 。 2. 多个线程可以同时进行读操作,但是同一时刻只能有一个线程去进行写操作,并且在一个线程进行写操作的时候,其他线程是不能进行读操作的。当一个线程正在写操作时,其他线程的读写都会返回操作失败
java并发的学习笔记(包含数据库多事务的并发)
             修订次数:2              我知道这个主题对我一个新人菜鸟有点太过大了,但是最近看了很多资料,后面有参考资料的出处。想总结一下,提升自己,所以打算在以后有了新的想法以及知识储备后,不断修订这篇文章,也希望大家可以对我不足的地方予以指导。             了解到这个问题是从《java编程思想》这本书,在这里不得不推荐这本书一下,真的很经典,可以说是让...
java多线程与并发之读写锁案例
Demo代码: import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWrite
多线程处理读写数据库,脏数据梳理
在使用多线程进行大量数据操作的时候,采用设置mysql唯一标识的方式来解决脏数据,多线程的目的是为了效率,如果加锁之后就等于失去了使用多线程的意义 第一步:CREATE UNIQUE INDEX index_t_keywords_library_unique_1 ON t_keywords_library (keyword,language_id); 第二步: try { keywor
MySQL的myisam解决并发读写解决方法
mysql的myisam解决并发读写解决方法MyISAM在读操作占主导的情况下是很高效的。可一旦出现大量的读写并发,同InnoDB相比,MyISAM的效率就会直线下降,而且,MyISAM和InnoDB的数据存储方式也有显著不同:通常,在MyISAM里,新数据会被附加到数据文件的结尾,可如果时常做一些 UPDATE,DELETE操作之后,数据文件就不再是连续的,形象一点来说,就是数据文件里出现了很多
MySQL高并发下读取脏数据问题的解决方案
MySQL 在遇到高并发读写的情况下会读到脏数据,如何理解?举一个简单的栗子: 用户A、用户B、用户C 抢购一件商品,每人限购一件,商品库存为10,假如 A、B、C 并发情况下则同时得到 库存为 10,同时对库存10进行操作,看下相关示意图: 用户A 操作: 库存 10 -1 =9,对应的 SQL: update table set goods_number=goods_
mysql读写性能测试
近来工作中用mysql较多,但其实自己对mysql性能并不十分了解。前阵子正好读到一篇写用mysqlslap压测mysql性能的文章,于是自己也尝试了一下mysqlslap并且得到一些数据和结论。把压测到的数据与大家分享,如有谬误之处请指正。若需要详细了解本文使用的压力测试工具mysqlslap请移步下面的链接:   用mysqlslap进行mysql压力测试 mysqlslap官方文档
高并发场景下数据库的常见问题及解决方案
一、分库分表   (1)为什么要分库分表   随着系统访问量的增加,QPS越来越高,数据库磁盘容量不断增加,一般数据库服务器的QPS在800-1200的时候性能最佳,当超过2000的时候sql就会变得很慢并且很容易被请求打死,而单表数据量过大也会导致数据库执行sql很慢,为了应付这种场景产生了分库分表这种思想和技术。   分表就是把一个表的数据放到多个表中,然后查询的时候你就查一个表。可以按...
解决数据库高并发访问瓶颈问题
缓存式的Web应用程序架构: 在Web层和db层之间加一层cache层,主要目的:减少数据库读取负担,提高数据读取速度。cache存取的媒介是内存,可以考虑采用分布式的cache层,这样更容易破除内存容量的限制,同时增加了灵活性。 实现MySQL数据库异步查询实现: 通常情况下在PHP中MySQL查询是串行的,如果能实现MySQL查询的异步化,就能实现多条SQL语句同时执行,这样就能
sqlite多进程并发读写模式下,返回SQLITE_BUSY错误的处理方法
SQLite作为一款小型的嵌入式数据库,本身没有提供复杂的锁定机制,无法内部管理多路并发下的数据操作同步问题,更谈不上优化,所以涉及到多路并发的情况,需要外部进行读写锁控制,否则SQLite会返回SQLITE_BUSY错误,以驳回相关请求,这是由于使用当前连接访问数据时,要申请相应级别的锁,而各个级别的锁有些是互斥的,当申请不到锁时就会返回这个错误。这时只要稍等片刻,等其它连接的操作处理完,释放了
oracle的读写表并发操作
 k 说(14:52):问个问题 查询数据库表的时候 该表还能写数据吗  是按照排队的顺序 还是按照操作的时间顺序(不知道oracle如何处理这个问题)  假设一个情况:我现在在查询计费表(这个时间可能要花10分钟) 10分钟有很多计费数据要入计费表(那这个写数据是要等我查询完了之后才能写吗) 写数据库肯定很快(0.1秒(还是来了数据就写) 查询依然查询写之前的数据 m说(14:54):能写m1说
多线程操作数据库--WAL模式--一写多读并行
最近项目需求,要写入比较多的数据到db中,同时又不能让用户在写的过程中停止其他查询操作,也就是需要满足写读并发。通过一阵Google,发现了WAL模式。 下面介绍WAL模式的优缺点: 优点: 1. 读和写可以完全地并发执行,不会互相阻塞(但是写之间仍然不能并发)。 2. WAL在大多数情况下,拥有更好的性能(因为无需每次写入时都要写两个文件)。 3. 磁盘I/O行为更容易被预测。缺点
数据库并发控制原理详解
数据库并发控制原理 数据库属于公共资源库,当多个事务并发处理数据库数据时,如果控制不当则会造成数据的不一致性,出现数据混乱。对此,数据库引入了锁机制来解决这一问题。为了弄清这个问题,首先要明白为什么多事务并发时会出现数据的不一致性,这要从数据库事务说起。 那数据库事务是个什么东东呢?其实简而言之,就是多个有关数据库的操作要么都一次性全部完成,要么都不完成。不能出现些数据库操作执行完了,而另外一
并发带来的问题——三种常见的读数据异常现象
如果说数据不在ACID特性的保护下会发生不一致的现象,那么:     在ACID的保护下,是不是数据就一定不会产生不一致的现象呢?     在关系数据库系统中,多个会话(session)可以访问同一个数据库的同一个表的同一行数据。这样,对于数据而言,就意味着在同一个时间段内,有多个会话可以对其施加操作(或读操作或写操作),读写操作施加的顺序不同以及事务中A特性对事务结果的影响(或成功或失败,即
php并发优化 —— 个人总结(读SQL数据库与直读硬盘对比)
我是一个前端,让我做一个用户自己做活动页的功能,提供给我的思路是:用户选择好模板,将模板编号存入数据库,并生成固定URL,用户访问些URL,直接从库中读取模板编号,然后拼接模板。 分析需求:用户自己生成的页面,都 是静态页面,多用于活动,及宣传用。某一时间段内的访问量可能会很高,如果一直读库拼接,势必会影响并发。于是做了一个测试: 1,首先看下我的库吧,只有四条记录,测试数据: 2,再看...
高并发访问数据库问题
在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节: 使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。 上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。
Java并发学习之十五——使用读写锁同步数据访问
本文是学习网络上的文章时的总结,感谢大家无私的分享。 读写锁重要的是写锁的使用,只用一个入口。 下面是读写锁使用的例子 package chapter2; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public cla
Go语言实现的并发聊天室(一)
Go语言实现的并发聊天室(一) 主协程:负责监听、接收用户连接请求,建立通信关系。 HandleConnect协程:负责处理用户连接。 Manager协程:负责监听Message通道中数据变化。 Message通道:负责传递用户消息。 Client结构体:保存客户端的信息。 map集合:键代表客户端IP,值为该客户端的数据通道,用来针对该客户端的消息传递。 WriteMsg...
高并发读写导致ConcurrentModificationException异常的解决办法
1、使用java.util.concurrent包下面的并发容器      网上搜、查API文档。 2、读写分离,写操作加锁(以synchronized为例,其中synchronized锁住的是括号里的对象) Thread thread = new Thread(new Runnable() { public void run() { for (int i
java大并发之数据库层面解决方案
    前言:当一个网站开始刚刚创建时,可能只是考虑一天只有几十或者几百个人访问,数据库可能就个db,所有表都放一起,一台普通的服务器可能就够了,而且开发人员也非常高兴,而且信心十足,因为所有的表都在一个库中,这样查询语句就可以随便关联了,多美的一件事情。但是随着访问压力的增加,读写操作不断增加,数据库的压力绝对越来越大,可能接近极限,这时可能人们想到增加从服务器,做什么集群之类的,可是问题又来了...
锁与并发-SQL Server
并发可以定义为多个进程同时访问或修改共享数据的能力。处于活动状态而互不干涉的并发用户进程的数量越多,数据库系统的并发性就越好。当一个正在修改数据的进程阻止了其他进程读取该数据,或者当一个正在读取数据的进程阻止了其他进程修改该数据,并发性就降低了。本文用术语“读取”或者“访问”描述数据上的SELECT操作,用“写入”或“修改”描述数据上的INSERT,UPDATE以及DELETE操作。 一般地,数...
python 并发读写文件
import threading from time import sleep import os import Queue class ExcThread(threading.Thread): def __init__(self,group=None, target=None, name=None, args=(), kwargs=None, ver...
mysql处理高并发-保证数据准确性
问题描述: 压力高并发情况下  执行update方法 得到结果非预期结果   例如: 多个线程执行 充值金额方法          1、先查询出目前金额信息a          2、将充值的金额组装a(原金额+充值金额=新金额)          3、更新金额(执行update方法) 问题: 多并发的情况下, 会是多个线程同时读取到目前金额a ,  之后 多个线
iOS 用队列实现读写线程安全
读写操作时,为了提高效率,应该允许同时多个线程读操作,并且只有一个线程写操作。 为了实现上面功能,将读和写分发到相同并发队列中,这样读操作会是并发的;而写操作,以 dispatch barrier 来保证同时只有一个线程可以执行写操作,并且由于写操作无需返回,写操作异步执行。 代码如下: dispatch_queue_t syncQueue = dispatch_get_globa
php 并发 读写文件冲突的解决实例
php 并发 读写文件冲突的解决方案解决方案核心思想:增加 临时写入文件数目,对众多临时文件文件进行随机读写,以降低并发的可能性。实例:在对用户访问日志进行记录时,这种方案似乎被采用的比较多。 先前需要定义一个随机空间,空间越大,并发的的可能性就越小,这里假设随机读写空间为[1-500],那么我们的日志文件的分布就为log1~到log500不等。每一次用户访问,都将数据随机写到log1~log500
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java并发视频学习 java 学习 并发