C# 如果我使用线程获取大量数据,是否应该使用多个连接?
我正在使用AS400的iDB2/iSeries连接器一次获取大量数据。我正在创建一个到数据库的连接,为了提高性能,我将这个连接与几个线程(大约10个)一起使用。总共创建并释放了50条命令,关闭了每个DataReader 除了一件事之外,一切都很顺利:我没有设法关闭那个连接。我得到了以下异常(第一行表示“对象引用未设置为对象的实例”):C# 如果我使用线程获取大量数据,是否应该使用多个连接?,c#,multithreading,db2,ibm-midrange,C#,Multithreading,Db2,Ibm Midrange,我正在使用AS400的iDB2/iSeries连接器一次获取大量数据。我正在创建一个到数据库的连接,为了提高性能,我将这个连接与几个线程(大约10个)一起使用。总共创建并释放了50条命令,关闭了每个DataReader 除了一件事之外,一切都很顺利:我没有设法关闭那个连接。我得到了以下异常(第一行表示“对象引用未设置为对象的实例”): 使用替代线程将使数据处理更加透明和清晰 关心共享您的连接-如果需要,请使用该声明 了解事务作用域和连接池-这是使用DB连接时需要了解的内容 如果在连接周围使用而不
如果在连接周围使用
而不是显式调用Close()
,是否仍会发生异常?坦白地说,我不记得上次调用Close()
-时使用更方便、更可靠。我使用了“使用”,但connection.dispose()方法真的关闭了连接吗?我不这么认为:如果我手动操作,我可以看到连接的状态仍然是“打开”。无论是Close
还是Dispose
都不会真正关闭连接,或者根据配置,两者都会关闭连接。默认情况下,大多数提供程序使用连接池,因此Close
和Dispose
都只是将基础连接放回可用池中。如果认为Dispose
在这里做了一些错误或不同的事情,那将是一种误解。如果禁用了连接池(通常在连接字符串上),然后Close
和Dispose
都将终止基础连接。清晰简洁:谢谢。在多个线程之间共享单个连接通常是不明智的。我已经用任务替换了所有线程:不确定是否会更改任何内容,但代码更清晰!谢谢我在读你的建议:我很快就会回来。一个小问题:如果我不更新/插入/删除,我真的需要锁吗?@Nicolas如果你从多个线程访问同一个连接,那么是:绝对需要。连接通常不用于并发访问,因此这里的锁
只是同步对连接本身的访问。如果您没有使用来自多个线程的同一连接,那么:否。
{"La référence d'objet n'est pas définie à une instance d'un objet."}
[System.NullReferenceException]: {"La référence d'objet n'est pas définie à une instance d'un objet."}
Data: {System.Collections.ListDictionaryInternal}
HelpLink: null
HResult: -2147467261
InnerException: null
Message: "La référence d'objet n'est pas définie à une instance d'un objet."
Source: "IBM.Data.DB2.iSeries"
StackTrace: " à IBM.Data.DB2.iSeries.iDB2Connection.Close()\r\n à WcfApp.Metier.InitApp() dans c:\\projet\\WSApp.cs:ligne 450"
TargetSite: {Void Close()}