在响应之后做数据库写

时间:2012-01-26 00:45:21

标签: asp.net

我有一个Web服务,它接收来自用户的请求并返回一些json。我需要将json字符串保存在数据库中,所以暂时,写入查询会在响应发送回来之前发生。

在响应离开Web服务后,有没有办法先发送响应然后再写查询?

感谢。

5 个答案:

答案 0 :(得分:2)

这里有几个不同的选择 - 但它们都有权衡,而且会非常深奥。你没有提到为什么你想要这样做,所以我猜测性能。如果是这样的话,我认为你正在咆哮错误的树 - 一个简单的写法几乎肯定不是你的性能问题。

所以,脱离我的头脑:

  1. 排队,as Ragesh mentions,将是一个很好的方法。这样可以在卸载写入时获得与事务类似的语义。但是,您仍然必须写入队列,这可能与写入数据库的开销大致相同。
  2. 您可以生成一个新线程(使用ThreadPool或System.Threading.Thread - 有一些关于哪个在ASP.NET中更可取的争论)来处理写入。这通常可以正常工作,但您可能会遇到未处理的异常,应用程序域重新启动等问题。
  3. 您可以将JSON数据存储到静态或Application变量中,然后使用Timer定期将它们写入DB。这将是多线程代码,因此您需要同步对集合的读/写。
  4. 与#3类似,将JSON数据存储到Cache中,并使用invalidation回调写入数据库。
  5. 存储在某处(内存,磁盘,平面数据库表等)的大量变体,稍后进行处理(ASP.NET,计划任务,Windows服务,Sql代理等)。
  6.   

    @frenchie说:响应从数据库读取json字符串开始,最后写回来。换句话说,如果用户发送请求,那么将要读取的json字符串必须是在上一个响应中写入的字符串。

    这使事情复杂化,因为异步工作中固有的不知道何时完成。如果在处理下一个请求之前需要执行异步部分(写回数据库),则必须执行等待以确保实际完成。为了做到这一点,你需要在客户端上保持服务器端状态 - 就服务而言,这不是最佳实践(尽管,听起来你已经在使用这些JSON请求/响应对)。

    鉴于这些复杂情况,我会确保您完成了剖析并确定它确实是一个性能问题。

答案 1 :(得分:1)

您应该考虑使用MSMQ,ActiveMQ或RabbitMQ等消息队列来执行此操作。当您收到请求时,您会将相关数据放入队列,并将您的响应发送给客户端。在队列的另一端,您将拥有一些从队列中读取数据并将数据插入数据库的进程。

答案 2 :(得分:1)

您可以安排查询工作,如

ThreadPool.QueueUserWorkItem(state => 
      this.AsynchronousExecuteReference());

 // and run
 static void AsynchronousExecuteReference()
 {
    // run here your sql update
 }

另一个在类中使用Thread的示例,您可以将参数传递给它。

public class RunThreadProcess
{
    // Some parametres
    public int cProductID;

    // my thread
    private Thread t = null;

    // start it
    public Thread Start()
    {
        t = new Thread(new ThreadStart(this.work));
        t.IsBackground = true;
        t.SetApartmentState(ApartmentState.MTA);
        t.Start();

        return t;
    }

    // actually work
    private void work()
    {
        // do thread work
        all parametres are available here
    }
}

以下是我如何运行它

  var OneAction = new RunThreadProcess();
    OneAction.cProductID = 100;
    OneAction.Start();

不要担心内存,CG知道这个过程一直使用,直到线程结束,所以我检查它并且CG不删除它并等待线程结束。

答案 3 :(得分:0)

这是缺少请求/响应的要点。除非你想进入像服务总线这样的异步命令,但那是pub / sub,而不是请求/响应。请求/响应的目的是在收到请求之后和发送响应之前在服务器上完成工作。即使工作正在向服务总线发送异步消息。

答案 4 :(得分:0)

您可以尝试将您的网络服务网址移至生命周期所在的ASPX页面。

在代码隐藏中,调用执行Page_Load或Page_Prerender中主要部分工作的例程(或者在发送响应之前适当的时候),然后在Page_Unload事件中执行数据库工作。已发送回复(http://msdn.microsoft.com/en-us/library/ie/ms178472.aspx)。