1

我有一个WCF service配置为PerCall. 每次调用都会建立Entity Framework与后端数据库的连接,并将加载一系列程序集。

程序集的加载是如何工作的WCF,它们会在每次调用时加载,还是在服务的每个生命周期加载一次?

在这方面改用是否有任何好处PerSession,或者这不是问题?

4

1 回答 1

2

仅加载 dll 的一份副本。

不同之处在于内存中的对象实例和与数据库的连接。

例如,如果您的解决方案有一个与数据库建立连接的 dll。假设服务器刚刚重新启动。每次通话:

  • 调用 1 进来的 DLL 将被加载到内存中并 JIT 编译
  • 将创建一个服务实例
  • 将创建到数据库的连接
  • 然后这个调用完成
  • 连接将被释放到连接池
  • 服务的实例将被释放,垃圾收集器将清理它。
  • 然后呼叫 2 和 3 同时进来
  • 加载了 dll 并编译了 JIT,因此这里没有工作
  • 将为 2 和 3 创建 2 个实例
  • 将从连接池中检索一个连接
  • 将创建一个连接
  • 然后调用完成
  • 连接将被释放到连接池
  • 服务的实例将被释放,垃圾收集器将清理它。

始终是第一次命中时 JIT 编译的 DLL 的单个副本。

  • 每个呼叫,每次呼叫的一个实例,在呼叫结束时处置。
  • Per Session,每个会话的一个实例,在会话到期时释放
  • Single,单个实例
于 2012-09-12T16:51:37.983 回答