从函数返回SqlDataReader的方式是否正确?未显式关闭连接是否有问题?
问题解答
1. 当前的连接处理方式有没有问题?
你在调用ExecuteReader时传入了CommandBehavior.CloseConnection,这个参数的作用是当SqlDataReader被关闭或释放时,自动关闭对应的SqlConnection。所以正常流程下,你调用rsTest.Close()后,底层的数据库连接确实会被关闭,功能上是正常的。
但这种写法存在明显隐患:如果在rsTest.Read()执行过程中抛出异常,rsTest.Close()就不会被执行,此时数据库连接无法被自动关闭,会造成连接泄漏。日积月累会耗尽数据库连接池的资源,导致后续无法建立新的数据库连接。
2. 保留executeSQL函数的前提下,如何确保连接被正确关闭?
可以用Using语句来包裹SqlDataReader,它会在代码块结束时自动调用rsTest.Dispose()——不管有没有异常发生。而Dispose()会触发DataReader的关闭,同时因为CommandBehavior.CloseConnection的存在,关联的SqlConnection也会被自动关闭,完美解决异常场景下的连接泄漏问题。
修改后的调用代码如下:
Using rsTest As SqlDataReader = executeSQL(someConnectionString, "select item from item_table") While rsTest.Read() 'do stuff End While End Using
补充说明:你的executeSQL函数本身不需要修改,因为CommandBehavior.CloseConnection已经把DataReader和Connection的生命周期绑定在了一起,只要DataReader被正确释放,Connection就会被关闭。
内容的提问来源于stack exchange,提问作者Joe Defill
相关产品推荐
相关产品推荐

