个人觉得高写入并发的话先用缓存缓冲一下,可以合并的写入合并成批量写入可以管一些用但终归写入量很大的话还是要在数据库端优化了,把并发写均衡到多台服务器上,应该没有别的办法了。如果瓶颈不再数据库那就是应用服务器处理能力不足,升级应用服务器。
Ⅱ 多线程访问同一个数据库,需要加锁么
多线程访问数据库,其中有一个线程会长时间占用数据库。这个线程是独立线程,另外有一个线程池也会访问数据库,这个线程池中的线程我用lock锁住数据库了,但是由于独立线程和线程池线程不在同一个方法中,所以访问数据库的时间不同,用lock只能对线程池线程有效 回答: 你这么讲一定能保证两个线程不会在一个时刻共同发起对数据库的访问么?除非你做了很多同步让两个线程都按照你设计的逻辑不发生访问数据库的冲突,否则你必须加锁。看你的说明,你应该没加同步,所以他会出现冲突,你不能缺锁,他是共享资源的访问了
Ⅲ 如何使用多线程同事访问多个sqlite数据库
SQLite作为一款小型的嵌入式数据库,本身没有提供复杂的锁定机制,无法内部管理多路并发下的数据操作同步问题,更谈不上优化,所以涉及到多路并发的情况,需要外部进行读写锁控制,否则SQLite会返回SQLITE_BUSY错误,以驳回相关请求。
返回SQLITE_BUSY主要有以下几种情况:
1。当有写操作时,其他读操作会被驳回
2。当有写操作时,其他写操作会被驳回
3。当开启事务时,在提交事务之前,其他写操作会被驳回
4。当开启事务时,在提交事务之前,其他事务请求会被驳回
5。当有读操作时,其他写操作会被驳回
6。读操作之间能够并发执行
基于以上讨论,可以看出这是一个典型的读者写者问题,读操作要能够共享,写操作要互斥,读写之间也要互斥
可以设计如下的方案解决并发操作数据库被锁定的问题,同时保证读操作能够保持最大并发
1。采用互斥锁控制数据库写操作
2。只有拥有互斥锁的线程才能够操作数据库
3。写操作必须独立拥有互斥锁
4。读操作必须能够共享互斥锁,即在第一次读取的时候获取互斥锁,最后一次读取的时候释放互斥锁
Ⅳ VC多线程访问数据库的数据传递问题
说一些概念性的东西吧。
COM操作,它有一套自己关于跨线程和跨进程的模型,这是个复合模型,会衍生出大约7,8种组合。学习COM,这个是一定要吃透的。楼主阅读一下关于CoInitializeEx函数的帮助文档,能多多少少体会到一些。但如果没学习过COM,光看MSDN的帮助文档,如坠云里雾里一般,很难理解的。因此,建议买本COM的书,稍微参阅一下,其次网上譬如CSDN中有很多热心人写的关于线程进程有关的COM模型,和使用规则,优缺点,可以拜读一下!
在MFC中,可能不太会形成跨线程传递变量的危害性,这种观念吧。所以,在MFC中,似乎我们能随心所欲在线程之间传递变量,但其实是不对的,典型的就是主线程创建的窗口和控件,最好不要在其它线程中直接操纵,而是通过线程间通信的方法,让创建窗口和控件的主线程来操纵窗口和控件。
因此,变量是不能乱传地,到了COM中,这个限制是非常明显的,COM中有概念叫MARSHAL、PROXY、STUB,当然它主要是进程相关的概念,同样说明了,非线程自己创建的东西,不是该线程使用就会有问题。
像VIEW这种界面的东西不要随便乱传给工作线程这种非界面线程。
我的建议是:
建工作线程,因为数据库操作及从数据库反馈到程序级的数据需要进行再加工,这些步骤都可能会非常耗时,耗时操作放在界面线程,会使界面线程无法处理WM_XXX的消息,造成界面假死。因此,像智能指针这种东西放到工作线程里进行独立管理,工作线程通过智能指针向数据库要数据,然后处理,存放数据结果到程序中约定的地方,如全局变量,虚拟内存等地方。数据处理完,通过自定义消息,向界面线程发送自定义消息,使界面线程能够在自定义消息中,将保存的数据显示到界面中,发送线程消息有个函数就是PostThreadMessage。
其他的细微细节也可以考虑,到底是创建自己的线程,还是使用线程池等。随着经验的丰富,会考虑很多问题的,关键是理论知识要学,实践也不能没有。
最后就是概念修正, _ConnectionPtr它是一个标准的C++类,C++类可以重载->操作符,这个被重载的指针操作符,使得通过该类实例化的变量在实际使用时,行为更像是一个指针,而不是个普通变量,这个被重载的指针操作符才是智能指针,而不是指_ConnectionPtr类是智能指针,顶多说它是个智能指针类,我也见过有翻译成灵巧指针的,英文原版是SMART POINTER。
Ⅳ 如何用多线程读取大文件并且做数据处理,100
先说几个要点:
a、文件在操作系统级,有描述符标记,关联到打开的文件表项,文件表项纪录了一个很重要的信息,当前文件的指针;
b、cpu要干的工作比读文件快不,读一次文件的速度要慢于cpu处理一次的速度,没必要多多线程,多线程提升不了多少性能,还增加编程的难度,单线程处理即可。
c、待处理文件,必须知道一定的边界值,如分页边界或单条纪录边界。
有了上面的前提,每个线程维护单独的缓冲区,缓存区大小就是c点提到的边界纪录大小。线程启动,把缓冲区读满,处理数据。此处有个要点,必须做文件锁,把要读的边界锁住。否则读出来的数据会产生混乱。(如果强行打开多个不同的文件不划算,内存占用可能会过多)。产生混乱的原因简单,读文件实际上是进行系统调用,系统调用有自己的缓冲区,这缓冲区未必跟你设置的缓冲区一样大。多次读多次移动指针,不加文件锁处理的数据必定会乱。
文件锁两种方式加锁,对整个文件加锁,对字节区间加锁。都不是什么难事。
实现方式1:对整个文件加锁,因为我们要保证的是读到的数据别混乱。
实现方式2:如果内存足够大,维护n个独立的文件描述符,这些文件描述符必须有独立的文件指针,操作系统上有对应实现。每个线程操作未读纪录,这么做还需要维护共享的已读纪录指针。防止重复处理。这么做处理完成如果需要按顺序合并文件是难点。处理过的数据有新的纪录边界。要视实际情况而定能不能这么做。写程序要优先保证的是正确性,之后才是提升效率。
我说的理论,依据是操作系统提供的api处理。别的语言要依赖操作系统运行。原理差不多,目标语言有没有操作系统提供的api强悍。依据使用的目标语言而定。绝大多数能叫编程语言的语言都会提供操作系统api对应的方法。(脚本语言例外,如shell,perl,javascript,vbscript,就可能没这么强的控制能力。),java,objective-c,swift,php,python一般是不会有问题的。
Ⅵ 项目中怎么控制多线程高并发访问
1、首先明确信号量Semaphore的用法,然后新建一个项目,new-->file-->class,随意命名,此处命名为semaphoreDemo。