NCache 是 .NET 的内存分布式缓存。 但由于其 100% 的本地客户端和第三方集成,它也支持 Java。 让我们快速浏览一下 NCache Java 客户端及其两个用于 Java 应用程序的第三方集成。
Java 客户端的基本缓存操作
安装后 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 |
try { // After having NCache up and running... // Connect to cache String cacheName = "demoCache"; Cache cache = CacheManager.getCache(cacheName); // Cache a product Product product = buildOrRetrieveProductToCache(); String key = "Product:" + product.getProductID(); cache.add(key, product); // Later in another part of our code... // Retrieve cached product Product foundProduct = cache.get(key, Product.class); if (foundProduct != null) { // Do something with the cached product here } else { // No product was found } } catch (OperationFailedException ex) { // Handle NCache-specific exceptions, like connection failures, here } catch (Exception ex) { // Handle generic exceptions, like IllegalArgumentException, here } |
使用 Java 客户端,我们有更多的缓存操作。 除了添加和检索单个项目外,我们还有批量操作来添加、检索、更新和删除项目; 和一个异步 API。 有关更高级缓存操作的更多详细信息,请检查 CRUD 操作:概述. 我们也可以在该指南中找到 Java 示例。
此外,在我们的 Java 应用程序中,我们可以使用 SQL 查询功能和索引策略 使用类似 SQL 的语法检索和删除缓存的条目。
通过这些缓存操作,我们在 Java 应用程序中编写了自己的缓存机制。 但是随着 NCache,我们可以利用其现有的第三方集成。 让我们来看看其中的两个。
NCache 作为 Hibernate 二级缓存
Hibernate 是 Java 的对象关系映射工具。 可能不需要太多介绍,因为它是 Java 世界中的一个广泛使用的工具。
为了避免与数据库的过多往返,Hibernate 使用不同的缓存机制:一级和二级缓存。 当从数据库中检索对象时,Hibernate 在它们之间回退。
第一级缓存是每会话缓存。 这是加载对象时 Hibernate 检查的第一个缓存。 与一级缓存不同,二级缓存是可选的。 它适用于所有会话。
Hibernate 不提供任何二级缓存的实现。 我们不得不依赖第三方缓存提供商。 NCache 像二级缓存一样工作。
RedFern NCache 在不更改我们的生产代码的情况下,通过配置文件作为 Hibernate 二级缓存提供程序。
二级缓存默认是关闭的。 启用它并使用 NCache 作为二级缓存,我们必须在Hibernate配置文件中配置它。 例如,这是一个 hibernate.cfg.xml
文件,
1 2 3 4 5 6 7 8 9 10 11 |
<hibernate-configuration> <session-factory> <!-- It enables Hibernate second-level cache --><!-- It enables Hibernate second-level cache --> <property name="hibernate.cache.use_second_level_cache">true</property> <!-- It configures NCache as a second-level cache provider, for Hibernate 3.6 and above ---> <property name="hibernate.cache.region.factory_class">JCacheRegionFactory</property> <!-- It's NCache applicaton identifier --> <property name="ncache.application_id">myapp</property><!-- It configures NCache as a second-level cache provider, for Hibernate 3.6 and above ---> JCacheRegionFactory </session-factory> </hibernate-configuration> |
NCache 作为二级供应商
NCacheHibernate.xml
.
Hibernate 使用区域将对象分组到一个名称下。 和 NCache,我们可以为每个区域设置单独的缓存实例,或者为多个区域设置一个缓存实例。 甚至我们可以为每个区域配置不同的 NCache 缓存功能。 我们还在 NCacheHibernate.xml
1 2 3 4 5 6 7 8 |
<configuration> <application-config application-id="myapp" enable-cache-exception="true" default-region-name="DefaultRegion" key-case-sensitivity="false"> <cache-regions> <region name="MyCustomRegion" cache-name="myPartitionedcache" priority="default" expiration-type="sliding" expiration-period="8"/> <region name="DefaultRegion" cache-name="demoCache" priority="default" expiration-type="none" expiration-period="0" /> </cache-regions> </application-config> </configuration> |
有关的更多详细信息 NCacheHibernate.xml
文件,检查 配置可缓存对象和区域.
即使我们启用了二级缓存,Hibernate 默认情况下也不会缓存对象。 我们必须通过注释或映射文件将我们的对象标记为可缓存。 例如,让我们注释一个 Product
类,
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 30 |
@Entity @Table(name = "Products") @Cacheable @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class Product { @Id @GeneratedValue @Column(name = "ProductID") private int ProductID; @Column(name = "Name") private String Name; public Product() {} public int getProductID() { return ProductID; } public void setProductID(int productID) { this.ProductID = productID; } public String getName() { return Name; } public void setName(String name) { this.Name = name; } } |
这样我们就可以使用 NCache 作为二级 Hibernate 缓存。 另外,我们可以使用 NCache 缓存查询结果。 我们可以通过缓存大型、复杂和频繁查询的结果来提高应用程序的整体性能。 学习如何使用 NCache 对于使用 Hibernate 的查询缓存,检查 使用查询缓存. 我们需要对 Hibernate 配置文件和要缓存的查询进行小的更改。
NCache 弹簧集成
NCache 也与 Spring 框架集成。 Spring 框架是 Java 平台的应用程序框架和控制反转容器。 我们可以插 NCache 进入 Spring 缓存模块,使其可扩展和分布式。
当我们使用 NCache 使用 Spring,我们通过减少数据库服务数据的次数来卸载数据库,从而提供更好的性能。
开始使用 NCache 使用 Spring,我们需要注释我们的配置类。 像这样,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Configuration @EnableCaching public class CachingConfiguration { @Bean public CacheManager cacheManager() { SpringConfigurationManager springConfigurationManager = new SpringConfigurationManager(); URL resource = getClass().getClassLoader().getResource("ncache-spring.xml"); springConfigurationManager.setConfigFile(resource.getPath()); NCacheCacheManager cacheManager = new NCacheCacheManager(); cacheManager.setSpringConfigurationManager(springConfigurationManager); return cacheManager; } } |
除了使用注释,我们还可以使用 XML 文件。 虽然,我们最好还是使用注释,因为我们可以在编译时发现类型错误。
通过注释或 XML 文件更改 Spring 配置后,我们需要配置实际的缓存。 在 - 的里面 ncache-spring.xml
文件,我们定义我们的缓存实例及其属性,如过期和逐出策略。 例如,
1 2 3 4 5 6 |
<application-config default-cache-name="default"> <caches> <cache name="ProductsCache" ncache-instance="demoCache" priority="normal" expiration-type="absolute" expiration-period="10"/> </caches> </application-config> |
在配置我们的 Spring 应用程序并启用缓存之后,下一步是注释我们要缓存的方法。 例如,要缓存我们从应用程序中的 API 控制器或其他服务调用的服务,我们可以编写,
1 2 3 4 5 6 7 8 9 10 11 12 |
@Service public class ProductService { @Cacheable("ProductsCache") public String getProductNameByCode(String code) { return retrieveProductNameFromDatastore(code); } private String retrieveProductNameFromDatastore(String code) { // Image a query to retrieve a product name from a database return "Any name"; } } |
完成所有这些步骤后,我们就可以使用了 NCache 与春天。
有关配置的更多详细信息 NCache 使用 Spring,检查 配置应用程序以供使用 NCache 作为 Spring 缓存提供者.
结论
这就是我们如何使用 NCache 支持基本缓存操作的 Java 客户端。 我们可以整合 NCache 使用 Hibernate 和 Spring Framework,仅进行配置和少量编码更改。
除了 Hibernate 和 Spring, NCache 还支持 JCache API。 我们可以用 NCache 在我们的 JCache 应用程序中使用相同的 JCache API 和分布式解决方案。 学习如何整合 NCache 使用 JCache,访问 JCache 指南.
对于具有 Java 和 .NET 后端的混合应用程序, NCache 支持可移植数据类型。 我们可以用 NCache 在 Java 和 .NET 后端应用程序之间共享数据。 例如,使用可移植数据类型,我们可以实现 JSON存储 NCache 在两个 .NET 和 Java 应用程序之间共享数据。
如果您想在 Java 应用程序中受益于分布式、可伸缩和高性能的缓存解决方案,请提供 NCache 一试。