我只想就使用SqlConnection对象的正确用法或正确设计发表意见。以下2中哪一个是最佳用途:
一个数据提供程序类,其方法(每个方法)包含SqlConnection对象(并在完成时处理)。喜欢:
IList<Employee> GetAllEmployees()
{
using (SqlConnection connection = new SqlConnection(this.connectionString)) {
// Code goes here...
}
}
Employee GetEmployee(int id)
{
using (SqlConnection connection = new SqlConnection(this.connectionString)) {
// Code goes here...
}
}
或
SqlConnection connection; // initialized in constructor
IList<Employee> GetAllEmployees()
{
this.TryOpenConnection(); // tries to open member SqlConnection instance
// Code goes here...
this.CloseConnection();
// return
}
Employee GetEmployee(int id)
{
this.TryOpenConnection(); // tries to open member SqlConnection instance
// Code goes here...
this.CloseConnection();
// return
}
或者有更好的方法吗?我有一个专注的Web爬虫类型的应用程序,此应用程序将同时爬网50个或多个网站(多线程)与爬网程序对象中包含的每个网站,每个爬虫对象都有一个数据提供程序类的实例(上图)。
答案 0 :(得分:5)
将合并实际的数据库连接。只要您的所有SqlConnection
实例都使用相同的连接字符串,它们就会真正使用相同的连接。
我发现创建连接实例,使用它然后处理它(在using
块中)更清晰。这样,如果代码需要更改为使用不同的连接字符串,使用事务或其他任何内容,那么您就可以在此处进行更改。
答案 1 :(得分:0)
也许没有真正相关,但是我唯一一次将任何连接对象分离到类实例级别的时候,我想要创建一个明确的分离关注每个方法正在做什么...也许它太长了,需要被重构成几个部分,每个部分都需要在交易的同一个连接上运行。
即
Create a connection
Start transaction
Call a subroutine to update an order header (passing along the connection or get it from the instance)
Call a subroutine to update all order details (passing along the conneciton or get it from the instance)
End transaction
Close connection
否则,我几乎坚持选项1. W /连接池它基本上不会花费你任何东西。