看到很多人的用法是这样的,在模块里定义一个SqlConnection,变成一个全局变量,比如这样:
[code=VB.NET]
Module sysVarible
Public conn As New SqlClient.SqlConnection
End Module
[/code]
然后,关于整个系统的数据库都基于这个连接的open()、close()来进行操作。
但是我想将这个conn放到一个类里面,作为一个实例变量,每次都创建一个这个类的实例,然后再在类里面
conn的各种打开关闭的方法,以及数据库的增删改查,请问哪种情况比较好呢?或者说两种没区别?
说明:
第一种方法好像很不错,不过以前从没用过这种方式,用着一个全局的连接,觉得很不习惯,也不知道会不会出什么性能问题
第二种,看起来是最好的,可是对于事务好像不太好控制,比如删除用户(deleteUser),并且删除用户相关的文章(deleteBlogsByUser),
这两个方法肯定在两个不同的实例中,也意味着使用不同的conn,那么这时候好像就不好控制事务了,不知道我的疑虑对不对
你可以使用微软提供的 SqlHelper 来解决你的问题,或者使用更大的 Application DataAccess Library.
第一种方法只会在一条连接上操作,杜绝了连接池的使用.如果有并发的使用该连接的调用,则会相互阻塞.
第二种方法,你对事务的判断是正确的,但是属于过渡设计范畴,SqlConnection已经实现了你打算设计的conn包装类.
正确的用法是在任何你想进行数据库操作的时候都做如下操作:
Code
你说的全局指的应该是一个页面或Request里的一个成员变量,而不是整个程序的static变量吧。这种情况对于事务控制是比较方便一点,但是要求在页面开始前open connection,在页面结束后close connection。应该比较适合Web应用里面,因为一个Web的请求通常很短,几十的ms吧,不会造成长连接的问题。
第二种事务确实不好控制,只能把相关操作都封装到同一个BLL里面,用同一个connection来做。