写WebService,在WebService类中写一个将数据库连接对象作为它的成员变量在构造函数中创建且打开连接,以便让所有的方法都调用同一个连接对象,这样在事务处理时就可以控制了。
比如方法A开启事务,调用方法B,方法A提交事务。但是现在有个问题,因为每次调用WS都执行一次构造函数,而.Net的延迟调用析构函数,而我是在析构中将连接关闭的,导致连接数超过连接池限制报错,同时同存占用也猛增。我又不想调用GC强制垃圾回收,这样做可能将连接直接释放了,不知道能不能放回到连接池中。
比如方法A开启事务,调用方法B,方法A提交事务。但是现在有个问题,因为每次调用WS都执行一次构造函数,而.Net的延迟调用析构函数,而我是在析构中将连接关闭的,导致连接数超过连接池限制报错,同时同存占用也猛增。我又不想调用GC强制垃圾回收,这样做可能将连接直接释放了,不知道能不能放回到连接池中。
解决方案 »
- 以&#开头的是什么编码,如何用C#转换成汉字
- 发布一个操作数组的类
- 文件加密如何实现
- c#应用程序打包运行时出现的错误,解决马上送分!
- C#中如何按位操作内存
- 资源文件使用问题
- Oledb select uuser,pwd from login where uuser=? and pwd=? Ado.net sqlclient
- c#能否编写ISAPI应用程序的问题?
- winform中切换图标实现闪动效果时,图标会出现为一个大红叉,不知道什么原因,请高手帮助
- 绝对不是搞笑! C#.NET 、C++BUILDER之一奇怪现象。请假专家!
- 请问高手们:用GDI+ 如何实现图形的放大与缩小
- 学C#用什么书比较好?推荐一下。
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;namespace demo1
{
/// <summary>
/// Service1 的摘要说明。
/// </summary>
public class Service1 : System.Web.Services.WebService
{
public Service1()
{
//CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
InitializeComponent();
//方法一使用 Service1_Disposed 事件
this.Disposed+=new EventHandler(Service1_Disposed);
}
private IContainer components = null;
private void InitializeComponent()
{
}
protected override void Dispose( bool disposing )
{
if(disposing)
{
//方法二在这里 <释放的代码>
int i=0;
}
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
[WebMethod]
public string HelloWorld()
{
throw new ApplicationException("abc");
return "Hello World";
} private void Service1_Disposed(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine("Service1_Disposed");
}
}
}
除非你的 服务器 挂了.....
Dispose 隐含 close 的
private OleDbConnection dbConn=null;
public test {
dbConn=new....;
}
public void A() {
System.Data.OleDb.OleDbTransaction myTran=null;
myTran=dbConn.BeginTransaction();
//一些数据操作
B();
myTran.Commit();
}
public void B() {
//使用dbConn作一些数据操作
}
}
不过找我的做法,可能如下更好:public void A() {
System.Data.OleDb.OleDbTransaction myTran=null;
myTran=dbConn.BeginTransaction();
//一些数据操作
B( myTran );
}public void B( OleDbTransaction myTran ) {
//使用dbConn作一些数据操作
}
有时候的逻辑是在方法A中调方法B.
而有时候不需要写入库就直接写库存的情况,那么就直接调方法B.
这种情况下难道非要给方法B一个Transaction 参数吗?
其他的时候不去关闭connection。
using System.Data;
using System.Data.OleDb;
namespace demo1
{
/// <summary>
/// test 的摘要说明。
/// </summary>
public class test:IDisposable
{
private OleDbConnection dbConn=null;
/// <summary>
/// 判断对象是否被调用过 Dispose
/// </summary>
private bool disposed = false; public test()
{
dbConn = new OleDbConnection("连接串");
} ~test()
{
Dispose(false);
} /// <summary>
/// 静态调用函数 如 test.Exec();
/// </summary>
public static void Exec()
{
using(test t = new test())
{
t.A();
}
} public void TryRollback(IDbTransaction tran)
{
try
{
tran.Rollback();
}
catch(Exception ex)
{
System.Diagnostics.Trace.WriteLine("TryRollback Error:" + ex.ToString());
}
} public void A()
{
System.Data.OleDb.OleDbTransaction myTran=null;
myTran=dbConn.BeginTransaction();
try
{
B();
myTran.Commit();
}
catch(OleDbException ex)
{
System.Diagnostics.Trace.WriteLine("test.A catch 01:"+ex.ToString());
TryRollback(myTran);
} } public void B()
{
//使用dbConn作一些数据操作
} #region IDisposable 成员 public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); }
private void Dispose(bool disposing)
{
if(!this.disposed)
{
if(disposing)
{
if(dbConn!=null)
{
dbConn.Dispose();
}
}
else
{
System.Diagnostics.Trace.WriteLine("没有 Dispose 本对象");
}
}
disposed = true;
}
#endregion
}
}
其他的时候不去关闭connection。
--------------------------------------------------------------------------------
只使用一个连接不是会影响数据库的并发吗?如果有100个客户端同时发起请求那速度~~汗.如果一个操作用一秒,那第100个用户就得要等上近2分钟.感觉不太好.不过也是一种方法,我以前是这样写的.
在Application_start里新建一个连接,在End里关闭连接.感觉影响并发所以才改掉的.如果让你现在写,你还是按前的方法写吗?