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呢?

4个回答

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

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

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

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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Lucene 索引的并发读写
lucene能够很好地支持多线程/进程 访问。 1.并发读 一个索引可以被多个进程的IndexReader打开。一个进程中,推荐IndexReader被单例多线程使用。 IndexReader类不仅是线程安全的,还是线程友好的,即友好地支持并发访问,代码中同步代码(synchronized)块并不多。 2.单独写 对于一个索引来说,一次只能打开一个In...
HashMap的读写并发
核心提示:大家都知道HashMap不是线程安全的,但是大家的理解可能都不是十分准确。很显然读写同一个key会导致不一致大家都能理解,但是如果读写一个不变的对象会有问题么?看看下面的代码就明白了。 1 import java.util.HashMap; 2 import java.util.Map; 3 import jav 大家都知道HashMap不是线程安全的,但是大家的理解可...
golang map并发读写
对应报错:fatal error: concurrent map writesfatal error: concurrent map read and map writehttps://wrfly.kfd.me/posts/read-and-write-in-high-concurrency/http://colobu.com/2017/07/11/dive-into-sync-Map/https...
HashMap的读写并发
大家都知道HashMap不是线程安全的,但是大家的理解可能都不是十分准确。很显然读写同一个key会导致不一致大家都能理解,但是如果读写一个不变的对象会有问题么?看看下面的代码就明白了。   import java.util.HashMap;import java.util.Map;import java.util.Random;import java.util.concurrent....
并发模型之并发读写
以前的学习留给我们一个未解决的问题:如果对象被更新,那么我们应该如何同步更新依赖? 或者换个角度,追踪状态变更的最佳实践是什么? 响应式编程是基于异步数据流的编程方式。流是廉价且无处不在的,一切都可以是流:变 量、用户输入、属性、缓存、数据结构,等等。
mysql 并发读写
开发多用户、数据库驱动的应用时,最大的一个问题是:一方面要最大程度地利用数据库的并发访问,另外一方面还要确保每个用户能以一致的方式读取和修改数据。因此就有了锁机制。这也是数据库系统区别与文件系统的一个关键特性。
sql并发读写疑问
我用c#编写了一个学生成绩录入程序,我需要在[color=#FF0000]多个[/color]客户端[color=#FF0000]同时[/color]使用该程序连接mssql,对其中[color=#FF0000]一个表[/color]进行成绩的录入和修改。疑问:rn1、在c#中使用一个用户名和密码登陆会不会有问题。rn2、上百个客户端同时对一个表进行操作,会不会有问题。rn
golang 中map并发读写
项目上之前出现map并发问题,查找资料后自己整理一下。代码如下://map 并发存取 type BeeMap struct { lock *sync.RWMutex bm map[string]interface{} }func NewBeeMap() *BeeMap { return &BeeMap{ lock: new(sync.RWMutex),
DataTable可以并发读写吗?
如题:多个子过程可以并发读写同一个DataTable吗?rn我已经这样做了,可是会发生各种各样的偶然异常。多数情况下都不会发生异常。偶尔会发生异常。多个子过程如何正确的并发读写同一个DataTable呢?rnrn详情请见http://social.microsoft.com/Forums/zh-CN/adonetzhchs/thread/5f2777b9-3494-4735-b89b-2fa344a85302
sync.RWMutex - 解决并发读写问题
原文地址:https://medium.com/golangspec/sync-rwmutex-ca6c6c3208a0原文作者:Michał Łowicki译文出处:h...
请教socket并发读写问题
各位大侠,rnrn在两个线程中使用同一个socket分别进行网收和网发操作,理论上是不是需要进行读写同步?rnrn谢谢!
MFC怎么读写数据库与读写数据库的问题?
我想用MFC做一个小系统用于读出ACCESS数据库,再对某个字段判断分类写到文件中。rn我该怎么读写啊。我以前做过的但当我的ACCess数据文件太大了的时候会出错。rn比如我之前处理过一个100多兆的Access文件就会出错,行不通。rn请问哪位高手有做过相关的东西,或者有代码可以共享那就更好了。rn谢谢!!!
数据库读写
我是一个VC的新手,如果做一个按条件读取数据库,并将内容显示引用程序,用MFC做的话因该怎么做,谁能给我一个例子参考啊,网上都是一段段代码,没有完整的例子供参考,谁能帮帮我这个忙?
关于新版Delphi的并发操作及公共变量并发读写
传统的编译型语言对多线程访问同一公共变量都会先锁定,旧版的Delphi亦如是,如果不先锁定,多半会有地址操作错误之类的运行时提示.   但XE的出现让一切都免了,固定内存占用的数据类型(integer,double,long之类)同时读写没事, 即使变长的String类型亦没事!! 除了公共变量, 连对象的属性都一样,下面是测试代码: type TForm1 = class(TForm)
数据库并发控制之并发调度
一、并发调度的可串行性 二、两段锁协议 三、封锁的粒度 四、其他并发控制机制
数据库如何处理并发?
本人做的一个会议室申请管理系统,但是有一个问题就是怎样处理两个申请同时发生?也就是两个人同时申请同一间会议室~怎么处理~给点思路..
数据库并发性问题
问题:因为有大量用户同时访问,经常在后台日志里看到2条同时插入的2笔相同的数据rnrn解决办法:当时没想到是并发性问题还以为是网页程序写的bug,后来用profiler截了下,发现只有update日志的那个存储过程会执行两次。rnrn第一次修改,在update前判断下log表里有没有相同的记录,有的话不插入。但是失败了rnrn第二次修改,把log表的id自动编号功能去掉,然后设置id为当前唯一主键,然后在update前获取下log表里id的最大值,然后inser into插入记录。最后判断错误号,错误号为0就说明记录插入成功,错误号不为0就不更新表,以下是代码rnrn[code=SQL]rn --当前时间rn DECLARE @Now DATETIMErn SET @Now = GETDATE()rnrn DECLARE @MaxID intrnrn --获取log表最大的id,锁定他,更新后释放...多并发的话会报错,报错返回NOrn select @MaxID=isnull(max(ID),-1) from Logs WITH(NOLOCK)rn set @MaxID=@MaxID+1rnrn --插入LOG日志rn insert into logs WITH(ROWLOCK)rn (id,TaskIDs, Urls, IP, UserAgent,VisitTime, UserID, Country) rn valuesrn (@MaxID,@TaskID,@Url,@ip,@Useragent,@Now,@Userid,@Country)rnrn if @@error=0rn beginrn update Urls WITH(ROWLOCK) set ShowTimes=ShowTimes+1 where id=@Urlidrn --成功返回YESrn select 'YES' as retrn endrn elsern --失败返回NOrn select 'NO' as retrn[/code]rnrn这样的思路就是即使并发性很多,但select出来的最大id肯定是同一个,然后挂个行锁。rnrn但是这样又失败了,55555rnrnrn不知道怎么解决并发性问题了
数据库并发问题
比较简单的问题 关于数据库rn一直没想明白,,我知道数据库里有并发控制的机制,但 如果有两个 会话 同时修改 同一个数据,这个时候 数据库会怎么做,它把哪个排前面 哪个排后面。[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/32.gif][/img]
高分:数据库并发控制问题!!
我使用VB.NET和SQL Server开发一个多用户数据库应用系统!rn1、我程序中怎么控制数据库的并发操作,是靠锁实现的吗?rn2、我现在建立一个开放锁recordset对象,当两个用户同时修改一条记录时,锁怎么处理的?rn3、VB的错误处理程序怎样捕捉这种错误??rn4、我如果使用只读锁,那么recordset的update方法就不可用了,但使用SQL语言还是能修改的,如果两个用户同时修改又该怎样控制??rnrn书上说的太理论了,哪位大虾能谈谈自己的经验!谢了!rn我的联系方式lingxiang80@vip.sina.com
数据库并发操作
我的应用是hibernate+c3p0完成数据库操作,服务器是weblogic和oraclernrn现在正在做压力测试,使用loadrunner,测试结果是:当300人同时并发登陆时,也就是查询数据库时,没有任何错误,但并发向数据库插入数据,3个人就不行了,这是怎么回事?用户正常操作的时候没事,出错时控制台显示session is closed,session was been closed之类的,哪位朋友见过同样的现象,帮帮忙呀!
并发插入数据库的问题
在一张页面里rn[code=C#]protected void Page_Load(object sender, EventArgs e)rnstring id = Request.QueryString["id"].ToString();rnSqlCommand cm = new SqlCommand(string.Format("insert into table1 values(0)", id), new SqlConnection(SqlHelper.DBConnectionString));rncm.Connection.Open();rnfor (int i = 0; i < 10000; i++)rnrn cm.ExecuteNonQuery();rnrncm.Connection.Close();rnrnrn[/code]rn如何有多个人同时在访问数据库是并发插入数据的,有什么方法可以不写存储过程 , 在c#程序里控制每次只有一个人执行完插入全部数据后其他人在执行
数据库并发访问
应用程序运行的windows terminal server上,在多用户情况下,如果两个用户同时修改同一个表的时候,就会发生错误.对这个表的修改是在用户做拷贝动作的时候发生的,在第一个用户拷贝的时候,这时候另外一个用户也去拷贝,他们都需要修改同一个表,这时候冲突就发生了,不可接受的时候,这个时候,第一个用户的操作也会中途失败.rn抛异常的地方 recordset::update()调用的dbcore.cpp:ThrowDBException((RETCODE)(lRowsAffected ==0 ?rn AFX_SQL_ERROR_NO_ROWS_AFFECTED:rn AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED))rn异常信息的pexception->m_strError是 no rows were affected by the update or delete operation.rn我想知道,有没有好的建议,在两个用户同时update一个表的时候,能够协调好.rn谢谢大家了.rn大概源代码是这样:rn[code=C/C++]rnvoid getID()rnrn begintrans;rnrn update(table);//这个函数出错,用的是ODBC机制rnrn committrans;rnrn[/code]rnrn上面这个函数会被在一些递归函数中调用很多次.谢谢大家了,份不够再开贴加.
Hiberante(十) 数据库的并发
一般并发会导致更新丢失,有两种解决方案可以解决并发的问题 1.悲观锁 悲观锁hibernate基于数据库的机制来实现的,此时hibernate3和hibernate所实现的机制一样, 都是是基于同步的机制实现的,当只要读取了这个对象 就要第一个对象读取完成之后,第二个对象才能读取,这样大大影响效率 2.乐观锁 乐观锁是在数据库...
数据库并发效率
对于现在的主流数据库或者开源数据库,如Oracle,SQL Server,PostgreSQL,DB2,MySQL等,哪些个数据库并发效率比较高?哪些比较低?
java-并发读取数据库
List&amp;amp;lt;Map&amp;amp;lt;String, Map&amp;amp;lt;String, String&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; data = new ArrayList&amp;amp;lt;&amp;amp;gt;(13); //线程池 ExecutorService threadPool = Executors.newFixedThreadPool(5);
高并发下的数据库并发控制策略
高并发下的数据并发控制策略 前言 在大流量的交易系统中,需要精心的设计和编排服务,才能支持业务操作。重所周知,开源数据库 的并发请求数是有限的,如何通过对业务流程进行设计,以扩大整个系统的服务能力是我们研究的方向。 业务场景 红包,秒杀等业务,大流量高并发交易系统需要面临的挑战。 控制策略 1. 数据库操作使用悲观锁,保证事务完整 待续.. 2. 数据库操
数据库存储过程并发问题
[b][size=16px][color=#000080]业务:[/color][/size][/b][size=14px]发奖品(把奖品分配给某个人)。[/size]rn[color=#000080][size=16px][b]存储过程:[/b][/size][/color]每次查询奖品表中,判断该人是否已经被分配,如果已经分配,就直接返回,如果没有分配,就更新奖品表进行分配。rnrn[color=#FF00FF][b][size=16px]问题:[/size][/b][/color]经常出现多个奖品分配给一个人的情况。就是说判断被跳过。rnSN表中UNAME有多个重复的。rnrn部分SQL如下:rnUSERS:用户表,SN:奖品表rn[code=sql]begin tran t1rnSELECT @UNAME=UNAME FROM USERS WHERE ID=@USERID--查询出当前人姓名rnIF NOT EXISTS(SELECT 1 FROM SN WHERE SSTATE=1 AND UNAME=@UNAME)--判断这个人是否领过奖,sstate=1就是领奖了.rnBEGINrn SELECT TOP 1 @SNID=ID FROM SN WHERE SSTATE=0 --查询出一条没有被领取过的奖品IDrn UPDATE SN SET SSTATE=1,UNAME=@UNAME,time1=GETDATE() WHERE ID=@SNID --分配给该人rnENDrnELSErnBEGINrn SET @CODE=104 --您已经成功获奖rn RETURNrnENDrncommit tran t1[/code]rnrn
数据库并发访问的问题???
各位高手:rn我小弟现在需要一个应用程序访问两个数据库系统(可以在同一台机器上也可以在不同的机器上)。rn 比如我查询的时候选择其中的一台机器,而插入等的时候选择两台!!rn
数据库大并发的必要性
各位高手,小弟最近在研究hadoop与MPP的并发处理,遇到了这么一个课题,数据库并发的必要性,业务原因,管理原因和设计原因。这个谁有这方面的经验吗?
数据库并发问题??????????
public class MyTestDemo rnrnpublic static void main(String[] args) rnThread a = new ThreadDemo1("a");rnThread b = new ThreadDemo1("b");rnThread c = new ThreadDemo1("c");rnrnrnrnrnclass ThreadDemo1 extends Threadrnint i;rnString str;rnString conn = "localhost/test";rnDBAccess db = new DBAccess(conn,"root","123456");rnrnpublic void run()rnfor(int n=0;n<100;n++)rntryrnString sql = "select count(*) from joysen_test";rnResultSet rs = db.queryData(sql);rnif(rs.next())rni=rs.getInt(1);rni++;rnString query = "insert into joysen_test (test) values ('"+i+"')";rnSystem.out.print(str+":::");rnSystem.out.println(query);rndb.insertData(query);rnrnrncatch(SQLException e)rnSystem.out.println(e);rnrnrnrnrnrnrnpublic ThreadDemo1(String str) rnthis.str = str;rnstart();rnrnrnrnrn这是用线程对mysql进行数据插入的代码,但在插入的时候它会报错。有哪位高手能指教一下啊,帮我解决对数据库并发问题,非常感谢!在线等待,急急急急急急急急急急急!!!!!
请教:数据库并发问题
本人做的一个系统中,如果好几个人同时操作同一个表,写入数据库中时,某个字段的数据就会乱掉,是不是数据库的问题,有必要加写锁么?本人用的是.net+sqlserver。
数据库并发访问题
数据库访问次数过多, 导致监听接口连接不上了。rnrn1. 环境:Linux 服务器, oracle 数据库, 库里有一张表 A。 多个客户端,每个客户端一个进程。rnrn2. 每个客户端的进程中都有4 个线程 并发访问表A,若有5个客户端的话,就有20个线程并发访问了, 使用OTL连接。rnrn3. 每个进程内的线程有锁控制,但5个进程没法用锁控制。rnrn4. 采用上面的方式访问表A。最初十几个小时都运行正常, 但超过60小时后,数据库所在的服务器监听接口就连不上了。估计60个小时的访问次数大概是30-40万次吧。 每次访问都先连接,然后很快的操作后就断开连接。rnrn[color=#0000FF]5. 各位大神,这个问题产生的原因会是什么呢? 是访问次数过多吗? 还是数据库本身有问题呢? 有什么好的解决方案么 。。 急救啊[/color]
数据库并发访问问题
现在有一个需求,假设有一张表rn[code=SQL]rncreate table Arn(rn id int primary key identity(1,1),rn code varchar(50)rn)rnrn[/code]rn就是生成二维码的程序,下一个二维码需要在上一个二维码的基础上加1rn比如上一个code是: rnins2008abc0001rn下一个就是rnins2008abc0001rnrn以此类推.rn这样我在程序中如果有并发访问的话,可以会读到同一个最大code,rn造成生成的二维码一样,而二维码必须唯一.rnrn各位有什么高见?rn欢迎大家一起来探讨.谢谢
数据库并发操作!
我在vc中继承一个CRecordSet类与数据库连接后,在运行中要求程序根据实时情况既要写数据库又要读数据库,怎样才能实现其并发操作而不产生冲突!
控制数据库并发??
不知各位在进行WEB信息开发有没有处理过这样问题。rnrn有两个用户A 、BrnrnA从数据库中读取一条记录要更新,当读取到显示在一个WEB 页面,用户A 会长时间没有提交更新。rnrn而B用户会在A读取后没有提交更新 读取在条记录,又比A 提前提交。就是说之后A的修改不是按当之前的内容修改了。rnrn什么进行这方面的控制。??,rnrn因为WEB 系统不能用 SELECT .... FROM...FOR UPDATA 这种读取方式。
数据库并发问题!!
SQL Server初学!!rn用select isnull(max(PlanID),0)+1 as PlanID from T_Plan_Mainrn查出这表里面最大的那个PlanID,用这个PlanID作为关键字将数据插入近表中rnrn但是用户多了以后,在我算出最大的PlanID之后别的用户先在这个里面插入PlanID的数据,再往里面插就插不进去了,rn也是查出最大编号,和按这个最大编号插入数据,中间有并发错误,请问如何解决,谢谢
数据库并发的问题与锁机制
数据库锁机制
【数据库】并发调度的可串行性
相关资料来源于网络,侵删歉。 如果文章中存在错误,请下方评论告知我,谢谢! DBMS对并行事务中各指令的安排执行(调度)是随机的,而不同的调度可能会产生不同的结果。 将所有事务串行执行的调度策略一定是正确的调度策略。 如果错了,一定是事务程序逻辑上的错误,不是因调度而产生的。 以不同的顺序串行执行事务也有可能会产生不同的结果,但由于不会将数据库置于不一致状态,所以都可以认为是正确的。 几个事务...
数据库并发的问题!!!
问题:rn   我在一个表提数据,提出一条的时候同时把这条的状态列改为正在使用,别的进程就提不出来了。但是并发的情况下还是可以提出来。这个过程我用的是一个存储过程。如下:rn    CREATE PROCEDURE getdatarn     @Area varchar(20),rn     @ptype varchar(20),rn    @hfType varchar(20),rn    @pc varchar(20) rnrn  asrn   declare @id intrn  beginrnrnrn    SELECT top 1 @id=id FROM phone where flag='1' and area=@Area and phoneType=@ptype     and callType=@hfType and arup=@pcrn    update phone set flag='2' where id=@idrn    select * from phone where id=@idrnrn  endrn但是当并发的时候,还有能提出同一条记录,但是如果加了事务的话,就会把整个表锁住,速度就明显很慢,而且cpu会很高,服务器就会死掉。请问,有没有好的办法!!!急!!!
数据库并发操作.ppt
数据库并发操作.ppt
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview