一个功能的多个SqlConnections:坏主意?

时间:2014-04-03 08:43:42

标签: asp.net sql

我有一个连接到我的sql数据库的asp.net gridview。当插入新记录或更新记录时,我正在做一些服务器端检查,然后更新/插入记录或什么都不做。现在我有两个方法CheckArtistExists和CheckSongExists都使用SqlConnection对象,例如。

public bool CheckSongExists(string _title, int _artistId)
    {
        int cnt = -1;
        using (SqlConnection con = new SqlConnection(CS))
        {
            //check if song already is exists in DB
            SqlCommand cmd = new SqlCommand("Select Count(ID) from tblSong WHERE Title = @newTitle AND ArtistId = @newArtistId;", con);
            cmd.Parameters.AddWithValue(@"newTitle", _title);
            cmd.Parameters.AddWithValue(@"newArtistId", _artistId);
            con.Open();
            cnt = (int)cmd.ExecuteScalar();
            // if cnt ==1 song exists in DB, of cnt == 0 song doesnt exist
            if(cnt == 1)
            { return true; }
            else
            { return false; }
        }
    }

因此对于gridview中的Update函数,我需要建立3个SqlConnections(最多)一个来检查艺术家(如果艺术家不存在我必须首先向tblArtist插入记录) 然后检查歌曲是否存在(仅当艺术家存在时),最后如果歌曲不存在,我必须插入新的记录。

我知道数据库连接是宝贵的资源,这就是为什么我把它们放在一个使用块中。所以我不太确定它的好样式是否使用3个SqlConnection对象来更新/插入。如果我的代码没问题,或者我应该使用其他方法来解决这个问题,请你告诉我。

谢谢

1 个答案:

答案 0 :(得分:1)

ADO.NET在ADO-NET Connection-Pool

内部管理DBMS的基础连接
  

实际上,大多数应用程序只使用一种或几种不同的应用程序   连接配置。这意味着在申请期间   执行时,将重复打开许多相同的连接   关闭。为了最大限度地降低打开连接的成本,ADO.NET使用了   优化技术称为连接池。

     

连接池减少了新连接的次数   必须打开。平民保持对物质的所有权   连接。它通过保持一组活动来管理连接   每个给定连接配置的连接。每当一个用户   调用在连接上打开,pooler查找可用的   池中的连接。如果池连接可用,则为   将其返回给调用者而不是打开新连接。当。。。的时候   应用程序调用关闭连接,pooler将其返回   合并的一组活动连接而不是关闭它。一旦   连接返回到池中,它已准备好在池上重用   下一次公开电话。

所以显然没有理由避免创建,打开或关闭连接,因为实际上它们根本没有创建,打开和关闭。这是“仅”连接池的标志,以便知道何时可以重用连接。但它是一个非常重要的标志,因为如果连接“正在使用”(连接池假设),则必须向DBMS开放一个新的物理连接,这非常昂贵。

如果你“重用”连接,那么你的性能没有提升,但相反。

  • 创建,打开(如果是连接),使用,关闭并将它们放置在您需要的地方(例如方法中)
  • 使用using-statement隐含地处理和关闭(如果是连接)

所以是的,每个方法使用一个连接是绝对正常的,因为如果启用了连接池,则根本不使用物理连接(默认)。

另一个问题是你是否可以改进你的方法。您可以创建一个存储过程来检查存在并相应地更新或插入。

Solutions for INSERT OR UPDATE on SQL Server