关于Web应用程序数据库连接的使用
之前的Post掀起掀然大波,砸砖者纷至沓来好不热闹。之前的Post观点不够明确,准确,先say sorry,重新整理思路后再分别说明
观点:对于一个WebApplication,提高整体吞吐能力,应该从提高单页的响应能力开始,对于WebApplication使用上的一个原子操作:打开一个页面而言,在整个页面的生存周期中打开的数据连接数量越少,开闭的次数越少效率自然越高。
约束:页面默认是同步的操作,我们在这里约定再不采用异步操作的时候,如果用异步操作优化,那么又是另外的问题了,会有其他的问题产生,比如当两次操作有前因后果的关系的时候。
首先就是关于数据库联接的问题,我这里用数据库联接而不用Connection就是为了滴水不漏,省得错把关公当秦琼把数据库连接和.NET的XXConnection对象混淆起来。
这里用代码来说明,为了保证观点的中性,我将使用NHibernate的实现来做例子。
这里暂时委屈一下NHibernate暂时这样子来用。
我们这里面临两个问题数据库连接的访在那里对象放在那里,其二就是如何使用,如果按照一些人的观点就是随需开,在需要的时候打开。比如
ISession vSession= mCfg.BuildSessionFactory().OpenSession();//创建会话工厂, 一般来说应该使用一个单例对象来封装会话工厂.

ITransaction vTransaction = vSession.BeginTransaction();//创建事物处理

try

{

vSession.Save(vEntity);//向数据库添加数据

vTransaction.Commit();

Labmessage.Text="OK";

}

catch(Exception ex)

{

vTransaction.Rollback();

Labmessage.Text="Error"+ex.ToString();

}

finally

{

vSession.Close();

}

这段代码来自http://www.cnblogs.com/surprise/archive/2004/10/13/51701.aspx
一般我们会将这段代码放进一个处理业务逻辑的对象。里面,当需要添加一个Entity的时候调用,当然Entity有更多的用法,不过我们在这里就对这样子的简单的来做第一个例子。
那么如果我们针对这一个简单实体封装了一个逻辑:添加XX(用户信息、Post)等,当我们需要在一个页面操作多个的时候,就会有一个问题,一个是事务,这里我们暂且跳开不管,然后的情况就是在这个页面频繁的关闭打开了多次数据库。
这个时候我所提出的一个页面一个Connection的方式就是指的,将:
ISession vSession= mCfg.BuildSessionFactory().OpenSession();//创建会话工厂, 一般来说应该使用一个单例对象来封装会话工厂.

ITransaction vTransaction = vSession.BeginTransaction();//创建事物处理

try

{

业务逻辑对象.操作(vSession)
vTransaction.Commit();

Labmessage.Text="OK";

}

catch(Exception ex)

{

vTransaction.Rollback();

Labmessage.Text="Error"+ex.ToString();

}

finally

{

vSession.Close();

}

这样子的代码写在页面上。
so,就是这个样子了,在业务逻辑里将操作做完了,以后不需要做数据库操作的时候就将数据库连接关闭,事务提交。
我不知道很多人是怎么理解的。
就写到这里,等大虾来拍砖,还有就是这样子的代码如果存在线程问题的话。那么是不是应该对page_load方法这样子的方法都要处理线程安全问题了?效率的问题不知道是频繁关闭打开数据库来的有效率?一个建议,如果不在乎这点开销的话也无所谓,如果为了结构上的清晰而让步,这点我不反对,但是这个指标绝对是在优化效率的时候应该考虑到的
很多人在上一片post里说这样子做要我会死得很难看,我就不明白了,还有其他不死的很难看的方法?
之前Post的连接http://www.cnblogs.com/Alexander-Lee/archive/2007/03/31/694847.html
观点:对于一个WebApplication,提高整体吞吐能力,应该从提高单页的响应能力开始,对于WebApplication使用上的一个原子操作:打开一个页面而言,在整个页面的生存周期中打开的数据连接数量越少,开闭的次数越少效率自然越高。
约束:页面默认是同步的操作,我们在这里约定再不采用异步操作的时候,如果用异步操作优化,那么又是另外的问题了,会有其他的问题产生,比如当两次操作有前因后果的关系的时候。
首先就是关于数据库联接的问题,我这里用数据库联接而不用Connection就是为了滴水不漏,省得错把关公当秦琼把数据库连接和.NET的XXConnection对象混淆起来。
这里用代码来说明,为了保证观点的中性,我将使用NHibernate的实现来做例子。
这里暂时委屈一下NHibernate暂时这样子来用。
我们这里面临两个问题数据库连接的访在那里对象放在那里,其二就是如何使用,如果按照一些人的观点就是随需开,在需要的时候打开。比如



































这段代码来自http://www.cnblogs.com/surprise/archive/2004/10/13/51701.aspx
一般我们会将这段代码放进一个处理业务逻辑的对象。里面,当需要添加一个Entity的时候调用,当然Entity有更多的用法,不过我们在这里就对这样子的简单的来做第一个例子。
那么如果我们针对这一个简单实体封装了一个逻辑:添加XX(用户信息、Post)等,当我们需要在一个页面操作多个的时候,就会有一个问题,一个是事务,这里我们暂且跳开不管,然后的情况就是在这个页面频繁的关闭打开了多次数据库。
这个时候我所提出的一个页面一个Connection的方式就是指的,将:


































这样子的代码写在页面上。
so,就是这个样子了,在业务逻辑里将操作做完了,以后不需要做数据库操作的时候就将数据库连接关闭,事务提交。
我不知道很多人是怎么理解的。
就写到这里,等大虾来拍砖,还有就是这样子的代码如果存在线程问题的话。那么是不是应该对page_load方法这样子的方法都要处理线程安全问题了?效率的问题不知道是频繁关闭打开数据库来的有效率?一个建议,如果不在乎这点开销的话也无所谓,如果为了结构上的清晰而让步,这点我不反对,但是这个指标绝对是在优化效率的时候应该考虑到的
很多人在上一片post里说这样子做要我会死得很难看,我就不明白了,还有其他不死的很难看的方法?
之前Post的连接http://www.cnblogs.com/Alexander-Lee/archive/2007/03/31/694847.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述