我创建了一个 TransactionScope,并在该范围内在数据库中创建和更新了各种项目。在此过程中,我对数据库进行了很多调用。最初我在 TransactionScope 的开头打开了一个 SqlConnection 并将其传递给任何进行 DB 调用的函数,然后在所有调用完成后和事务提交之前关闭连接。这样做更好还是为每次调用打开和关闭连接(使用相同的连接字符串)更好?
4 回答
如果您要连续进行大量调用,并且很容易传入开放连接,那么可以,重用开放连接。
不过,这并不是非常重要。没有以前那么多了。ADO.NET 可以很好地为您管理这个。请参阅连接池。如果您的代码会变得复杂和怪异以促进一个单独的、开放的连接对象,那么这是不值得的。
(现在,确保你的连接对象(无论是否重复使用)被处理掉当然非常重要,我敢打赌你已经知道了。)
我倾向于不惜一切代价避免传递连接。例如,当其他人在一系列操作中间关闭连接时,我刚刚看到太多错误潜入系统,因为他们不知道其他人将使用相同的连接。
由于 ADO.NET 的连接池机制,创建 SQLConnection几乎是免费的,所以不要认为通过创建和传递它会节省任何空间/时间。
如果在您的情况下,您确实需要在事务范围内执行许多数据库操作,那么适当地管理您的范围,但在需要时创建、使用和处置您的连接 - 这将有助于保持你的代码更干净、更安全。
总的来说,我会同意其他人所说的。但是请注意,一旦您在单个 TransactionScope 实例中使用多个连接,它会将您的(本地)事务提升为分布式事务,从而产生一些可能很大的开销。
来自同一个池的多个连接,因此使用同一个数据库,在这个意义上也算作多个连接。
如果这对您来说是个问题,与代码结构或“清洁度”、典型的 SQL 语句执行时间等相比,您需要做出决定。
无论如何,如果想与数据库建立多个连接,请使用连接池。