我现在正在努力解决这个问题。
在我的网站上,要求用户参加测试。当他提交答案时,我调用了一个WCF服务,它将数据推送到数据库中。这很简单,但随着用户数量的增加,确实会成为数据库密集型。
因此,为了提高性能(避免大量调用DB),我有 -
一个。在服务中实现了缓存。
湾实现线程(用于异步工作) - 将缓存数据推送到DB。
因此,现在,每当保存答案的调用到来时,它都会将数据存储在服务缓存中。平行地,我运行一个线程(因为我想将数据只推送到DB一次 - 在用户测试结束时 - 并在缓存中添加临时答案数据),然后我返回调用,因为我不想要用户要等待。我运行的线程必须超时15分钟。如果用户在15分钟内未提交任何答案,则应将缓存的结果保存到DB。直到现在它很简单并且设法做到了。
我遇到的问题是,如果用户发送了一些答案并且在这15分钟内对服务进行了调用,那么该线程的超时应该重置为接下来的15分钟。所以,它有点滑动计时器的线程。
我已经google了很多,但似乎无法跟踪线程。而且,如果我在每个保存数据请求上创建一个新线程,那么它只会在数据库上重现相同的负载。
我觉得如果可以通过某种方式跟踪我首次启动的线程并相应地操作它,我将能够实现所需的功能。
请建议并提出建议。
紧迫感谢
SV
答案 0 :(得分:0)
您应该回答Albin的查询。无论如何你可以试试这个:
当用户提交查询(WCF服务调用)时,将调用时间保存在DB或某个全局对象中。
在线程超时逻辑中计算now和上次请求的时间之间的差异。 如果差值> = 15,则释放线程,保存数据并创建新数据。否则不要发布。
答案 1 :(得分:0)
我不确定我是否理解为什么每次向缓存添加数据时都要打开一个线程。你不能只是将数据添加到缓存中:
如果答案出来,请在缓存中找到数据并保存到数据库。
每隔一段时间运行一次“清理”线程,以便在超过15分钟的缓存中查找数据并保存到数据库并清理缓存。 或强>
无缘无故地阻塞线程永远不是一个好主意,如果你正在实现一个服务器,你可能应该使用ThreadPool - 并且阻塞ThreadPool线程绝对不是一个好主意。
无论如何,你应该确保数据库是你的瓶颈,因为你的当前设计会遇到很多麻烦。例如,如果服务器崩溃但尚未将数据保存在数据库中呢?