我在使用ASP.NET Webforms 4应用程序的codebit上遇到了问题。 我使用的是SQL Server 2008 R2,IIS 7,该网站在单独的应用程序池中运行在Windows Server 2008 R2上(集成模式,.NET4,支持32位程序集)。
以下代码存在问题:
Dim sqlCmd = New SqlClient.SqlCommand
With sqlCmd
Using sqlConnectionToUse As SqlClient.SqlConnection = GetActiveConnexion(pstrConnectString), _
vAdaptor As New SqlClient.SqlDataAdapter
.Connection = sqlConnectionToUse
.CommandText = pstrSQL 'function parameter
vAdaptor.SelectCommand = sqlCmd
'query1: SELECT somecolumn FROM table WHERE somecolumn '' ==> opens a new connection in SQL Server
'query2: SELECT someothercolumn FROM anothertable WHERE someothercolumn 23 ==> uses my WebSite process active connection
vAdaptor.Fill(vDataSet)
End Using
End With
UPDATE: GetActiveConnexion()方法在我的情况下只执行以下代码:
Return New SqlClient.SqlConnection("my connection string obtained from the web.config file")
当我运行query2时,一切顺利,ASP.NET应用程序使用应用程序池的打开连接,我在数据集中得到结果。
但是,每当我运行query1时,在SQL服务器中打开一个新连接(我可以看到它出现在SSMS的活动监视器中),并且这个连接仍然打开。问题是,如果我运行此查询1次100次,我会达到连接池的限制,并且会发生非常糟糕的事情。我仍然在数据集中获得结果,可以使用它们等... 新连接是在vAdaptator.Fill()调用时创建的。
对于什么是错的任何想法?
非常感谢你的时间。 (PS:抱歉英语不好)。
以下是C#中的代码,供喜欢的人使用:
object sqlCmd = new SqlClient.SqlCommand();
using (SqlClient.SqlConnection sqlConnectionToUse = GetActiveConnexion(pstrConnectString)) {
using (SqlClient.SqlDataAdapter vAdaptor = new SqlClient.SqlDataAdapter()) {
sqlCmd.Connection = sqlConnectionToUse;
sqlCmd.CommandText = pstrSQL; //function parameter
vAdaptor.SelectCommand = sqlCmd;
//query1: SELECT F10_ID FROM FIN_MONTANT_TT_F10 WHERE F10_ID_TT_F19 = '' ==> opens a new connection in SQL Server
//query2: SELECT A48_ID FROM ADH_EPARTICIPANT_ADMIN_A48 WHERE A48_ID=23 ==> uses my WebSite process active connection
vAdaptor.Fill(vDataSet);
}
}
答案 0 :(得分:1)
您的SqlCommand
实例应该包含在using块中,因为它是Disposable。这可能是你问题的根源。
using (SqlClient.SqlConnection sqlConnectionToUse = GetActiveConnexion(pstrConnectString))
{
using (SqlCommand sqlCmd = sqlConnectionToUse.CreateCommand())
{
using (SqlClient.SqlDataAdapter vAdaptor = new SqlClient.SqlDataAdapter())
{
...
}
}
}
或VB
Using sqlConnectionToUse As SqlClient.SqlConnection = GetActiveConnexion(pstrConnectString)
Using sqlCmd As SqlCommand = sqlConnectionToUse.CreateCommand()
Using vAdaptor As New SqlClient.SqlDataAdapter()
...
End Using
End Using
End Using