每当我们谈到提供对对象的访问和操作的便利性时, 对象关系映射器 (ORM)必然会出现。 Entity Framework Core 和 NHibernate 等 ORM 有助于管理 普通旧 CLR 对象 (POCO) 数据库信息的实例,管理关联,约束等。
但是,使用 code-to-SQL 功能可能会导致性能滞后甚至下降,最常见的原因是 N+1 问题。 StackExchange 的人们对 ORM 满足其基础设施需求的性能不满意,并提出了 短小精悍的,一个围绕 ADO.NET 的微型 ORM 轻量级包装器,速度极快,并且使对象映射到数据库模型变得非常简单和直观。
小巧玲珑的集成 NCache
Dapper 主要是在 IDb连接 类并为通常复杂的 ADO.NET 操作提供一个外观。 这是其轻量级和高速度的主要原因。 但是,如果要确保数据保留在内存中以避免往返数据库,请使用 NCache. 使用分布式缓存,例如 NCache,您可以使用数据源提供程序进一步优化性能,如下图所示:
NCache 更多信息 数据源提供者 使用 Dapper 的数据源
具有数据源提供者的第三方 Dapper
每当需要访问后端主数据源以进行读写时,数据源提供程序都是最佳解决方案。 这些提供程序将 Dapper 操作卸载到服务器端。
让我们看看我的应用程序如何使用 Datasource Providers 满足 Dapper 库的需求。
实现这个简单的 通读 使用 Dapper 库直接从数据源读取数据的提供程序 NCache 并缓存结果可以提高应用程序的性能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public ProviderCacheItem LoadFromSource(string key) { var customerId = key.Replace("Customer:CustomerID:", "").Trim(); var commandDefinition = new CommandDefinition($@" SELECT * FROM dbo.Customers WHERE CustomerID = @cId", new { cid = customerId }, flags: CommandFlags.NoCache); var customer = Connection.Query<Customer>(commandDefinition).FirstOrDefault(); var providerCacheItem = new ProviderCacheItem(customer) { Dependency = GetCustomerSqlDependency(customerId), ResyncOptions = new ResyncOptions(true) }; return providerCacheItem; } |
NCache 更多信息 数据源提供者 使用 Dapper 的数据源
同样,要将数据直接写入数据存储, NCache 提供了一个 直写 提供者从您那里获取数据并将其写入数据存储区,同时保留缓存副本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public OperationResult WriteToDataSource(WriteOperation operation) { Customer customer = null; if (operation.OperationType == WriteOperationType.Add || operation.OperationType == WriteOperationType.Update) { customer = operation.ProviderItem.GetValue<Customer>(); } if (operation.OperationType == WriteOperationType.Add) { var commandDefinition = new CommandDefinition(// INSERT sql command for customer data with customer id , customer, flags: CommandFlags.NoCache); Connection.Execute(commandDefinition); } else if (operation.OperationType == WriteOperationType.Update) { var commandDefinition = new CommandDefinition(// UPDATE sql command for customer data with customer id, customer, flags: CommandFlags.NoCache); Connection.Execute(commandDefinition); } else if (operation.OperationType == WriteOperationType.Delete) { var customerId = operation.Key.Replace("Customer:CustomerID:", "").Trim(); var commandDefinition = new CommandDefinition(// delete sql script for given customer id , new { cId = customerId }, flags: CommandFlags.NoCache); Connection.Execute(commandDefinition); } } |
NCache 更多信息 数据源提供者 使用 Dapper 的数据源
你可以在哪里找到这个详细的解决方案 NCache 使用 Dapper 库来填充和读取数据存储 GitHub上.
我将列出我注意到的好处 NCache-Dapper 协作。
好处 #1:用于同步的数据源提供程序
为了避免在缓存中保留陈旧的数据,数据源提供者与 数据库依赖特性 保证缓存数据与数据库中数据的同步。 重新同步缓存的所有操作都在服务器端完成,无需任何客户端参与。
好处 #2:备用客户端应用程序的数据源提供程序
假设您要更改数据存储:任何模式更新、表变体,即使您完全更改整个数据存储,方法如下 NCache 为您简化流程。 和 NCache 您无需更改客户端应用程序的数据源提供程序,更新数据源实现就足够了。
好处#3:可扩展 NCache 存储查询结果
如果您的应用程序运行在多个应用程序实例在共享缓存的负载均衡器(例如服务器场、Kubernetes 集群)后面运行的环境中,那么这就是 NCache 确实:如果其中一个实例查询数据源,结果将存储在分布式缓存中,因此当其他实例查询相同的结果时,它们直接从缓存中获取结果,而无需往返数据源。
这减少了对您的数据库的访问,并且具有可扩展性, NCache 可以通过简单地实时扩展集群来满足请求负载的增加,而无需关闭集群。
NCache 更多信息 数据源提供者 使用 Dapper 的数据源
把它们加起来
在 ORM 为您提供便利的地方,它们也可能会加重您的应用程序并导致意外的性能下降。 然而,Dapper 非常轻便,并且在构建高效查询和命令时为需要牢记这些知识的开发人员提供了更多控制权。
既然你已经掌握了一些东西,为什么不尝试使用分布式缓存,比如 NCache 用它? NCache凭借其内存中和易于扩展的功能,以如此精确的方式补充了 Dapper 库,结果令人瞠目结舌。 所以,去拿 NCache 现在!