2011-06-03 94 views
0

我有一个asp.net webmethod是静态的,它会删除用户的文件在数据库中的操作。 file_name通过jQuery作为输入发送。但是对于数据库连接,我需要使用静态DBconnection对象。asp.net jquery ajax - 静态web方法问题

当多个用户从UI中删除自己的文件时,jQuery将会使用同一个静态方法,它使用单个Static连接对象。 那么同时出现多个请求,这个删除只会删除最后一个(最新的请求)用户文件从数据库中删除吗?如果是的话,如何在asp.net中使用jquery-ajax来处理这个问题。

如果我说错了,请抛出一些光线。

[更新] 服务器端代码:

public static void DeleteAttachment(int fileId, string fileLoc) 
    { 
    SqlDBAccess objDBAccessStat = new SqlDBAccess(); 
    ....... 
    } 
+0

可以提供jqueyr脚本plz – 2011-06-03 09:49:44

+0

jquery脚本工作正常..问题出在服务器端。它使用静态方法和静态DBConnection。 – Raghav 2011-06-03 09:57:34

回答

1

显然,如果你分享多个请求同时存在不是讲会发生什么之间的数据库连接。这是根据定义undefined

你需要做的是隔离事物(使其成为非静态的)或引入一个强制传入请求无限期等待的锁(直到操作可用)。

这本身不是特别难,但需要小心,以免引入死锁。

我建议尽管你不要让你的方法是静态的,但是非静态方法更加独立并且与它自己的连接对象一起使用将不会容易出现相同的并发问题。

这里重要的是,当多个用户碰到该方法时,数据库连接不是全局共享资源,或者出错。

只是改变它的东西是这样的:

static void WebMethod() 
{ 
    using (var conn = ProviderFactory.CreateConnection("connection string goes here")) 
    { 
     conn.Open(); 
     // Do work here 
    } 
} 

有关上述整洁的部分是,你将不会被垃圾邮件与连接的服务器仅仅是因为连接池是默认启用的,假设你使用SqlClient数据库提供程序。但它会给你一个很好的隔离范围conn做你的数据库工作。

+0

有没有办法使用非静态方法作为Web方法,并从Jquery调用它..? – Raghav 2011-06-03 09:55:27

+0

静态方法可以自己创建实例并对其调用操作。通常这就是你要做的。我甚至不认为有必要将数据库连接作为静态成员,您可以在需要时创建它。如果你已经在使用'SqlConnection',连接池将在这里提供帮助? – 2011-06-03 09:57:26

+0

酷哥们..这个作品..即使我的代码工程..很抱歉。连接字符串在应用程序变量中,并且在尝试访问时引发编译器错误。 – Raghav 2011-06-03 10:11:38

3

你可以使用Webservice

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "WebService.asmx/WebMethodName", 
    data: "{}", 
    dataType: "json" 
}); 

而WebService方法不一定是静态的。

[System.Web.Script.Services.ScriptService] 
public class WebService : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public void WebMethodName() 
    { 
     //Do your stuff here 
    } 
}