想做一个中型门户网站,预计同时在线人数可达到1000人以上,采用下面哪种数据库连接方式最合理。1、一个页面共用一个连接
描述:页面载入时打开数据库连接,而页面中不管有多少数据操作都用这个连接,最后用完后关闭连接。2、每次会话用一个连接
描述:用户访问时打开数据库连接,并将连接存入Session,之后的所有属于该会话的数据库操作都应用这个Session存储的连接,在Session_End时关闭连接。3、每一个操作一个连接
描述:这好像是目前用的最多的方法。即不管同一页面需要有多少个数据库操作,每操作一次打开一个新数据库连接,用完后,立即关闭;然后又打开,又关闭。有的复杂的页面可能就需要这样开开断断十来次,性能上总感觉有点问题。
我个人认为第1种方式比较好,大家觉得呢?欢迎指导。非常感谢。或者大家还有更好的处理方式,也请不吝赐教,再次感谢。
描述:页面载入时打开数据库连接,而页面中不管有多少数据操作都用这个连接,最后用完后关闭连接。2、每次会话用一个连接
描述:用户访问时打开数据库连接,并将连接存入Session,之后的所有属于该会话的数据库操作都应用这个Session存储的连接,在Session_End时关闭连接。3、每一个操作一个连接
描述:这好像是目前用的最多的方法。即不管同一页面需要有多少个数据库操作,每操作一次打开一个新数据库连接,用完后,立即关闭;然后又打开,又关闭。有的复杂的页面可能就需要这样开开断断十来次,性能上总感觉有点问题。
我个人认为第1种方式比较好,大家觉得呢?欢迎指导。非常感谢。或者大家还有更好的处理方式,也请不吝赐教,再次感谢。
{
using(SqlConnection conn=new SqlConnection(ConnString))
{
.....//使用这个连接conn
}
}void Process_2()
{
using(SqlConnection conn=new SqlConnection(ConnString))
{
.....//使用这个连接conn
}
}void Process_3()
{
using(SqlConnection conn1=new SqlConnection(ConnString))
{
.....//使用这个连接conn1
using(SqlConnection conn2=new SqlConnection(ConnString))
{
.....//使用这个连接conn2
}
}
using(SqlConnection conn3=new SqlConnection(ConnString))
{
.....//使用这个连接conn3
}
}这都是好的编程方法。
using(SqlConnection conn=new SqlConnection(ConnString))
这些都是创建一个新的数据库连接吧,开一个关一个,再开再关,这样不断重复,性能估计还是有点问题吧?
SQL Server引擎的数据库连接不能共享。那么:
用Access的数据库,数据库连接能共享吗?
答:可以b/s结构的Access数据库“网站”就有很多了,我这里主要说网站啊。
尽管你所说的就应该被理解为Access数据库,你的1和2也没有考虑避免异步操作的问题。
答:是的,如果是access数据库,对于我提出的三种方法都无法避免异步问题,但目前好像也没有谁能解决好Access的异步问题。但如果能找到一个相对比较稳定,性能也比较好的方法,那也是个不错的选择。
打开和关闭都与连接池操作。
在连接字符串可以设置池中大小(可以容纳多少连接数)创建连接池只在第一次操作发生。
其实做系统都要找到一个平衡点,每次连接创建Connection影响你系统性能很小,因为每次和.net连接池打交道,并不直接创建数据库连接操作。在大多数情况都会对数据库的操作进行封装,在DAO操作与自己封装的操作类打交道,有的还完成DAO的工作,这些对象每次创建会有系统开销比较大,因为不是一个类完成而是一组类,这时应该建立自己的对象池,或com,让容器帮助你完成对象池的工作。
例如:
IDataBase database=DataBaseFactory.GetDataBase();
IDataProvider provider=database.GetDataProvider();
provider.Insert(new User("admin","yourpassword","otherInfo"));像database你完成可以做对象池来管理,还可以对IDataProvider有类似管理
简单一点如:
public class DataBaseManager:IDataBaseManager
{
public IDataBase GetDataBase()
{
lock(this){
IDataBase database=frees[0];//当然要检查一下
bounds.Add(database);
frees.RemoveAt(0);
return database;
}
} public void Close(IDataBase database)
{
lock(this){
IDataBase temp=bounds[database];
frees.Add(temp);
bounds.Remove(database);
}
}
}以上都是伪代码.
你也可以做其它的方法来实现。