加个判断
if (SqlHelperconnectionState == SystemDataConnectionStateClosed)SqlHelperconnectionOpen();
else (SqlHelperconnectionState == SystemDataConnectionStateBroken)
{
SqlHelperconnectionClose();
SqlHelperconnectionOpen();
}
对于数据库来说都是支持并发访问的,但是从 ComboPooledDataSource 中获得的 Connection 连接对象不是线程安全的,一个 Connection 只能在一个线程中,或者局部变量中使用,不得在多个线程中共享一个 Connection。
以下是我看到的Kevin关于其使用的心得,原文的大体的意思是:Android例子涵盖了一些Sqlite的基本用法,但它们并没有深入地给出合理的使用方法,更重要的是,不合理的使用方法。大多数例子和文档只是涉及最基本的数据库查询,或者教你如何创建一个ContentProvider。从来不提及的地方像: · 什么地方创建和保存SQLiteOpenHelper实例? · 可以有多少个实例? · 多线程同时访问数据库有没有什么要担心的?基本的内容是,你可以任意次数地连接Sqlite数据库,而且Android系统也支持你这样做。Sqlite拥有文件级别的锁,用来同步访问和防止错误。如果你只知道这些,那么,将会给你带来很大的痛苦。开源的一个好处是,你可以深入代码一探究竟。从代码和一些测试中,我了解到以下事实: · Sqlite拥有文件级别的锁。许多线程可以同时读,但只有一个可以写。锁阻止多个同时写入。 · Android在SQLiteDatabase中实现了一些java锁来确保动作是同步进行。 · 如果你用多个线程疯狂地访问数据库,你的数据库不会(或不应该)崩溃。没提到的是,如果你通过多个不同的真实连接同时写数据库,其中的某个会失败,它不会等到前一个完成后继续写入。简单地,不会写入你的改变,更糟糕的是,你也得不到一个异常,只是在LogCat中输出一些message,仅此而已。SQLiteOpenHelper类做了一些有趣的事。尽管它有方法可以获得一个只读的连接和可读写的连接,但实质上它们是同一个连接。假设没有文件写错误的话,只读的连接实质上就是一个可读写的连接。有趣吧。因此,如果你的app中使用一个helper的话,即便从多线程中使用,你也从未使用多个连接。同样,一个helper中只有一个SQLiteDatabase的实例,这个实例中实现了一些java锁。因此,当你正在执行数据库的 *** 作时,其它db的 *** 作都将锁定。即便是你使用多个线程来做这些事以便优化数据库的性能,坏消息,没有什么用。按照我的认识,SQLite工作的方式,基本上不可能会破坏你的数据库,除非代码里有bug或者有硬件问题。因此,我推荐这样使用:创建一个SQLiteOpenHelper静态对象。什么时候去close它呢?不需要。当app关闭,它会自动释放文件引用。但是,会不会有“close() was never explicitly called on database”异常呢?如果你注意的话,当连接挂在那里的时候,你没有得到那个异常。你只是在连接已经建立,而你又尝试打开另一个时才会有异常。因此,你只需要打开一次连接。像这样来使用:public class DatabaseHelper extends OrmLiteSqliteOpenHelper{ private static DatabaseHelper instance; public static synchronized DatabaseHelper getHelper(Context context) { if (instance == null) instance = new DatabaseHelper(context); return instance; }//Other stuff } 就这些。。。
你问题描述不清楚,那里出问题了?还是不会多线程?还是多线程报错?想别人问题之前自己要先整理出清晰的描述问题的思路,否则很难得到满意的答案哦~~~
创建线程不用多说,我想你肯定知道。
执行插入 *** 作,无非就是在线程中执行 INSERT 语句而已。
注意事项及要点:
1)最好不要多根线程共享一个 Connection 连接对象,否则极可能报错。
2)如果必须多根线程共用一个 Connection 连接对象,必须设置互斥锁。
针对1:在线程方法中创建 Connection 对象,并执行 INSERT 语句。
针对2:用 lock 关键字锁住注资源(如:lock(connection){ 执行 INSERT 语句的代码 })
注1:Connection 对象,不支持多线程并发,因此两个或以上线程同时使用 Connection 对象会发生错误。
注2:利用 lock 关键字的例子,其实就是利用互斥锁保证在某个时间片中,只有一根线程访问连接对象。
错。连接数据库要连接池,就是connection对象要放在一个LinkedList里面,然后每个线程一个。这个这个List被封装在一个单例模式的对象里。线程要是共享connection,要是搞起并发来,一下子就挂了。
以上就是关于c#socket多线程与数据库同时读写的连接问题全部的内容,包括:c#socket多线程与数据库同时读写的连接问题、C/C++用一个连接多线程并发访问数据库会不会有问题、如何使用SQLite等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)