不同Thread中使用相同OledbConnect 实例的问题
2005-05-26 16:23
375 查看
环境:win2003+vs2003+oracle9i
有下面的类:
using System;
using System.Data;
using System.Data.OleDb;
namespace MyData
using System;
using System.Threading;
namespace MyData
{
public class Test
{
private OraData data=new OraData();
private Thread work;
private void do()
{
while(true)
{
data.HaveData("ta");
}
}
private void Dowork()
{
while(true)
{
data.HaveData("tb");
}
}
private void doagain()
{
work=new Thread(new ThreadStart(Dowork));
work.Start();
}
}
}
如果只调用do(),那么没问题,一切正常,如果执行过程中在调用了dogain(),那么会发生异常,导致Thread work终止,而且原先进程的do()也会有异常,用try..catch捕获异常得到:
都是“未将对象引用设置到对象的实例。”指向的都是Con。
同时还有“ExecuteScalar 需要打开的并且可用的连接。该连接的当前状态是 Open, Executing。”,指向了HaveData().
觉得很奇怪,既然说Con没有将对象引用设置到对象实例,那么怎么会执行ExecuteScalar(),而且Con是建立了Pooling的,即使程序请求多个数据库联接,也是没问题的。
既然问题发生在2个进程使用相同的OledbConnection,而单个Thread的操作没有问题,那么说明有Pooling的相同OleDbConnection实例,面对2个Thread时工作有问题。
如果把Con设为static,又没有效果呢?
测试了一下,还会出现“ExecuteScalar 需要打开的并且可用的连接。该连接的当前状态是 Open, Executing。”错误。那只能理解为Pooling面对2个Thread工作有问题。
那么该怎样解决呢?
我用的方法是:建立另一个OleDbConnection,
private OledbConnection AnotherCon =new OleDbConnection();
放在Con的下面,OraData的构造函数中加入AnotherCon的ConnectionString,
在HaveData()中判断操作的表,根据不同的表使用不同的OleDbConnection,经过测试没有问题。
深层原因,还在查资料,有了结果,再做补充。
目前结论:
OleDbConnection对象,在MultiThread中是不安全的,不论使用实例还是静态方法。
所以建议每个工作进程都使用自己的OleDbConnection对象。
谢谢回复:
因为Thread,翻译成进程、线程似乎都可以,为了描述准确,文章中全部使用Thread,谢谢大家的理解。
欢迎大家发表见解。
有下面的类:
using System;
using System.Data;
using System.Data.OleDb;
namespace MyData
using System;
using System.Threading;
namespace MyData
{
public class Test
{
private OraData data=new OraData();
private Thread work;
private void do()
{
while(true)
{
data.HaveData("ta");
}
}
private void Dowork()
{
while(true)
{
data.HaveData("tb");
}
}
private void doagain()
{
work=new Thread(new ThreadStart(Dowork));
work.Start();
}
}
}
如果只调用do(),那么没问题,一切正常,如果执行过程中在调用了dogain(),那么会发生异常,导致Thread work终止,而且原先进程的do()也会有异常,用try..catch捕获异常得到:
都是“未将对象引用设置到对象的实例。”指向的都是Con。
同时还有“ExecuteScalar 需要打开的并且可用的连接。该连接的当前状态是 Open, Executing。”,指向了HaveData().
觉得很奇怪,既然说Con没有将对象引用设置到对象实例,那么怎么会执行ExecuteScalar(),而且Con是建立了Pooling的,即使程序请求多个数据库联接,也是没问题的。
既然问题发生在2个进程使用相同的OledbConnection,而单个Thread的操作没有问题,那么说明有Pooling的相同OleDbConnection实例,面对2个Thread时工作有问题。
如果把Con设为static,又没有效果呢?
测试了一下,还会出现“ExecuteScalar 需要打开的并且可用的连接。该连接的当前状态是 Open, Executing。”错误。那只能理解为Pooling面对2个Thread工作有问题。
那么该怎样解决呢?
我用的方法是:建立另一个OleDbConnection,
private OledbConnection AnotherCon =new OleDbConnection();
放在Con的下面,OraData的构造函数中加入AnotherCon的ConnectionString,
在HaveData()中判断操作的表,根据不同的表使用不同的OleDbConnection,经过测试没有问题。
深层原因,还在查资料,有了结果,再做补充。
目前结论:
OleDbConnection对象,在MultiThread中是不安全的,不论使用实例还是静态方法。
所以建议每个工作进程都使用自己的OleDbConnection对象。
谢谢回复:
因为Thread,翻译成进程、线程似乎都可以,为了描述准确,文章中全部使用Thread,谢谢大家的理解。
欢迎大家发表见解。
相关文章推荐
- 领域建模有很多种方法,对于同样的问题域使用不同的建模手段得到的模型可能也不尽相同。于是我经常听到这样一个问题:怎么才能保证建模的正确性?
- 使用ODBC和OLEDB两种方式执行同一个存储过程,结果不同的问题!
- 水晶报表使用,解决相同数据库不同服务器使用同一个水晶报表模板问题?
- iOS小问题--使用NSPredicate比较两个数组中相同(不同)的元素
- 不同请求获取到了相同的ThreadLocal值引起的问题
- 关于使用??初始化GameObject实例却并没有生效的技巧性问题
- 使用 JDBC 连接不同版本 DB2 数据库的兼容性问题
- JavaScript使用指针操作实现约瑟夫问题实例
- 使用AfxBeginThread须注意的问题...
- Android使用ZBar扫描二维码/条形码(实例)+常见问题汇总
- ExtJs MVC架构中不同的View实例使用不同的Store实例
- CGAL3.6中的实例在QT4中使用的问题
- copyPixels只能在相同大小的实例变换中使用
- 使用游标将excel不同表的列关联,并根据两表间相同的列值逐行更新数据
- 实例讲解Python的函数闭包使用中应注意的问题
- 有如图所示的七巧板,试设计算法,使用至多4种不同颜色对七巧板进行涂色(每块七巧板一种颜色),要求相邻区域的颜色互补相同,打印输出所有可能的涂色方案。
- mysql服务器和客户端时区不同,使用jdbc得到的结果差8小时的问题
- Jedis出现connection timeout问题解决方法(JedisPool连接池使用实例)
- 解决Windows和Linux使用npm打包js和css文件不同的问题
- 使用OLEDB读取不同版本Excel数据的连接字符串设置