多线程读数据库

SoulRed 2016-05-13 11:12:04
这个数据库只用来读,
数据库连接是一个线程用一个,还是共用一个?
如果同时有多个线程同时select 查询会有问题么?
...全文
199 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2016-05-13
  • 打赏
  • 举报
回复
查询会有什么问题?多线程只有对数据进行增删改的时候需要Lock
lkr2380869 2016-05-13
  • 打赏
  • 举报
回复
一个线程用一个,每个数据库连接对象不一样,彼此不影响,只是数据库服务器端同时接收多个对象的访问; 多个线程同时查询,是多个数据库对象对服务器访问,并发压力在数据库服务器端; 另外,每个查询结束后,一定要将数据库连接对象关闭掉。
xdashewan 2016-05-13
  • 打赏
  • 举报
回复
用多个没问题,用一个有问题
sp1234_maJia 2016-05-13
  • 打赏
  • 举报
回复
按照比较好的编程模式,你写代码时,就是写
using(DbConnection conn= 创建数据库连接())
{
    conn.Open();
    .......数据库操作
}    
这样的代码就行了,这样老老实实地“及时关闭数据库连接”(using{ } 结构的结尾会确保自动关闭数据库连接),而用不着你去处理什么“共享连接”的问题。 如果你想考虑多一点,就理解ado.net 的连接池概念。它说明了:为什么要“及时关闭数据库连接”。
  • 打赏
  • 举报
回复
比如说我在运行中想临时记录日志,但是又不想耽误当前线程的响应(因为逻辑上完全并发运行),我就写
var 日志内容 = "asdfasdfaasf";
ThreadPool.QueueUserWorkItem(h =>
{
    Log.Write("abc", 日志内容);
});
这个日志动作可能用5毫秒就完成了,假设这里的 Log 语句是记录到本地的某个数据库中,此 Log 语句完全由 .net 系统线程池去分配(复用)另外一个已经空闲下来的线程去执行那一行 Log 语句。它此时根本跟“一个线程用一个连接”没有任何关系。 再比如说我在 ADO.NET 使用 DbDataReader 循环遍历一个数据库查询结果时,其中的我还是需要访问数据库,那么在这个循环之内我肯定还要使用另外一个数据库连接,否则ADO.NET 就会抛出“连接已经打开,不能重复使用”之类的异常崩溃了。此时也谈不上线程了,一小段代码都需要“至少两个数据库连接”才能保证执行。 可见,想太多太技术化了,反而在开发时没法应用技术。
  • 打赏
  • 举报
回复
但是最为诡异的是“一个线程用一个”,你如何编程设计呢?我猜你并不能写出任何代码来说明它,只是概念猜想吧?
  • 打赏
  • 举报
回复
什么叫做“一个线程用一个”?能够给个具体说明? 对于ado.net 使用的 SqlDbConnection 等 DbConnection,数据库连接基于线程池管理,你应该及时释放连接,否则就不能共享了。所谓“共用一个”不但没有用上连接池机制,而且还 hang 死在单一的连接上了。
刘欣的博客 2016-05-13
  • 打赏
  • 举报
回复
这个数据库只用来读, 数据库连接是一个线程用一个,还是共用一个? 如果同时有多个线程同时select 查询会有问题么? 一个线程用一个才应该叫多线程吧,共用一个是单线程吧。 数据只被读取,随便怎么读都可以吧。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧