2009-02-22 100 views
10

我在寻找最佳实践来实现将从ASP.NET应用程序中写入SQL服务器内的日志的TraceListener在.NET中实现自定义TraceListener

哪些是应当实现这样的类,以避免性能下降时,要考虑的事情?

存储过程会比普通的ADO.NET INSERT语句更快吗?

我真的很喜欢在从后台线程以后的某个点上的日志写入到一个临时的内存缓冲区,并刷新到数据库的想法,但什么数据结构是最适合这样的场景? Queue<T>似乎是一个很好的候选人,但我不能在没有某种同步机制的情况下向它添加元素。

我在互联网上找到了一个article,它显示了一个自定义TraceListener的例子,它写入SQL服务器但在将其放入生产代码之前,我想获得更多反馈。

+0

想知道这一点! – Cerebrus 2009-02-22 16:23:33

+0

我无法找到链接的文章,我认为[本文](http://www.codeguru.com/csharp/.net/article.php/c19405/Tracing-in-NET-and-Implementing- Your-Own-Trace-Listeners.htm)就是你所指的那个。 – 2015-05-07 17:54:39

回答

4

存储过程不会比参数化SQL更快。我更喜欢在我的应用程序中使用硬编码SQL的存储过程,但是如果您要生成插入语句,那就更好了。

使用缓冲区是一个好主意,如果你确定与您可能失去数据的想法。如果你想从插入中分离出客户端,并且你希望它是持久的,你可以使用MSMQ。然后,您可以编写一个可以处理队列的Windows服务,并且可以完全脱离应用程序。如果您有服务器场,它也可以聚合来自多个服务器的日志。

+0

@Josh,MSMQ似乎是一个好主意。我没有任何经验,但我会进一步挖掘它。感谢指针。 – 2009-02-22 16:42:22

1

我不能以是否SP的发言比ADO插入速度更快,但我会一直建议保留querys/nonquerys在你的应用程序,而不是在数据存储中。就像你现在一样,数据存储是用于数据而不是逻辑的。避免SP。

MS SQL Server是一个复杂的机器,我不认为自己的申请能够引起你的代码阻止来自太多记录到你的数据库。显然这取决于您的具体实施情况,从您对性能的兴趣我可能会认为您打算支持高容量。即时消息说,我不认为你需要一个内存队列或服务来包装日志过程。只需将你的aspnet应用程序中的跟踪刷新到数据库,并忘记缓存/刷新。在将记录查询保存在内存中之后,SQL会将照片写入磁盘 - 它实际上管理得非常好。 SQL的查询缓冲区将确保您的代码在您刷新跟踪时不会阻塞。如果你不相信我,请在调试窗口中用时间戳测试它。如果你确实需要调整它,那么调整应该在你的数据库的内存设置中。你不需要在这里发明一个包装器,使用SP或者在你的服务器上启动另一个服务器(比如MSMQ),这会消耗更多你珍贵的CPU和内存。