假设我们正在执行许多不同的sql命令,并且SqlCommand.CommandTimeout保留默认值30秒。假设其中一些sql命令只是长查询,我们可能会遇到超时异常。
如果我说错了,请纠正我,这个异常只是因为.Net不想再等待了,但是如果我们使用连接池,这个连接可能仍然保持打开状态,那么那个sql语句可能仍在SQL服务器端运行吗?还是这两个系统之间存在某种隐藏的通信方式突然停止它,无论我们是否使用连接池?
只想知道机制是什么,它会影响SQL服务器性能吗?我的意思是,如果查询确实很长,例如需要10分钟才能运行,如果它仍在运行,它可能会不必要地减慢服务器速度,因为没有人可以得到结果。
更新
所以,这里我特别问的是连接池,代码肯定会关闭连接并进行异常处理,或者我们可以假设正在使用一个由@dash命名的首选模式。问题是,如果我在SqlConnection对象上调用Close()或Dispose()方法,它将返回到连接池,而不是物理关闭它。
我想知道当它返回到池中时,那个长查询是否仍在SQL Server端运行。如果可能,如何避免这种情况。
再次更新
感谢@dash提到数据库事务,是的,回滚会使它等待,我们还没有关闭连接并将其返回到池中。那么如果只是一个长时间的选择查询或更新,但只涉及一个单独的更新而没有任何数据库事务呢?具体来说,我想知道是否有一种方法可以告诉SQL Server我现在不需要结果,请停止运行它?
如果我说错了,请纠正我,这个异常只是因为.Net不想再等待了,但是如果我们使用连接池,这个连接可能仍然保持打开状态,那么那个sql语句可能仍在SQL服务器端运行吗?还是这两个系统之间存在某种隐藏的通信方式突然停止它,无论我们是否使用连接池?
只想知道机制是什么,它会影响SQL服务器性能吗?我的意思是,如果查询确实很长,例如需要10分钟才能运行,如果它仍在运行,它可能会不必要地减慢服务器速度,因为没有人可以得到结果。
更新
所以,这里我特别问的是连接池,代码肯定会关闭连接并进行异常处理,或者我们可以假设正在使用一个由@dash命名的首选模式。问题是,如果我在SqlConnection对象上调用Close()或Dispose()方法,它将返回到连接池,而不是物理关闭它。
我想知道当它返回到池中时,那个长查询是否仍在SQL Server端运行。如果可能,如何避免这种情况。
再次更新
感谢@dash提到数据库事务,是的,回滚会使它等待,我们还没有关闭连接并将其返回到池中。那么如果只是一个长时间的选择查询或更新,但只涉及一个单独的更新而没有任何数据库事务呢?具体来说,我想知道是否有一种方法可以告诉SQL Server我现在不需要结果,请停止运行它?