Hibernate Second-Level Cache를 NCache로 구현

이 튜토리얼에서는 Hibernate에서 NCache를 사용하여 두 번째 수준의 캐시를 实施하는 방법을 탐구할 것입니다.

우리는 Hibernate를 사용하는 Java 응용 프로그램을 설정하고, NCache를 두 번째 수준 캐시로 configure 할 것입니다. inally, 구현을 시험하여 캐시가 데이터 베이스 부하를 줄이고 パフォーマンス를 改善시키는 것을 확인할 것입니다.

기본

实施 전에 Hibernate, NCache, 以及 Hibernate 두 번째 수준 캐시의 기본을 이해하 let’s 를 하고자 합니다.

Hibernate

Hibernate는 자바 응용 프로그램에 대한 오픈 소스 오브젝트-관계 매핑(ORM) 框架입니다. 이를 사용하면 데이터 베이스 인터셉션 개발을 简素화하고자 합니다 Java 객체를 데이터 베이스 테이블에 매핑 하고 반대로 하는 것입니다.

パフォーマン스를 改善시키기 위해 Hibernate는 두 수준의 캐시를 제공합니다:

1. 첫 번째 수준 캐시

첫 번째 수준 캐시는 Hibernate 세션과 관련이 있으며 기본적으로 사용되고 있습니다. 세션 期间에 가져오는 오브젝트를 저장하고 같은 오브젝트에 대해 데이터 베이스에 多次 찍는 需要을 제거하는 것입니다.

첫 번째 수준 캐시는 세션 범위에 限制되며 세션 사이에서 공유되지 않습니다.

또한 persistent 하며 세션이 닫toryclear 되거나 명시적으로 clear 되면 제거되는 것입니다.

2. 두 번째 수준 캐시

두 단계의 캐시는 세션 사이에 공유되며, 응용 レベルで 데이터를 캐시하기 위한 설정이 가능합니다. 오브젝트를 더 长得이 存储하여 데이터 베이스 ACCESS의 수를 줄여줍니다.

두 단계의 캐시는 명시적으로 설정되어야 합니다. NCache, Ehcache 등의 다양한 캐시 제공자를 사용하여 구현할 수 있습니다.

NCache

NCache는 .NET 및 Java 응용 프로그램에 대한 분산 캐시 솔루션입니다. 자주 액세스되는 데이터를 캐시하고 응용 성능을 향상시키기 위한 메모리 데이터 스토어를 제공합니다.

NCache는 리플리케이티드, 분할, 클라이언트 캐시 등의 다양한 캐시 топология를 지원합니다.

NCache는 Hibernate에서 두 단계 캐시로 사용되어 데이터베이스에 直接的하게 요청하지 않고 오브젝트를 스토어하고 가져오는 것을 지원합니다.

코드 세팅

Java 응용 프로그램을 만들고 Hibernate을 데이터 베이스와 interact하는 것을 지정하는 것을 시작하십시오.

Maven을 의존성 관리와 프로젝트 빌드를 할 때 사용할 것입니다. 응용은 데이터를 정의하기 위한 엔티티 클래스와 데이터베이스와 交互하기 위한 클라이언트 클래스를 가지게 됩니다.

まず, 캐시를 사용하지 않는 응용을 실험하여 데이터 베이스 인터섹션을 확인하십시오. 그 다음, Hibernate에서 두 단계 캐시로 NCache를 설정하여 엔티티 오브젝트를 캐시하고 데이터 베이스 인터섹션을 줄이는 것을 구현합니다.

의존성

우선, pom.xml 파일에 Hibernate와 NCache의 필요한 의존성을 추가하겠습니다.

<dependencies> <!-- Hibernate dependencies --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.6.1.Final</version> </dependency> <!-- NCache dependencies --> <dependency> <groupId>com.alachisoft.ncache</groupId> <artifactId>ncache-hibernate</artifactId> <version>5.3.3</version> </dependency> </dependencies>

주의: 여기에 提到하는 versio n은 最新 릴리스에 따라 다를 수 있으므로 项目에 적절한 버전을 사용하시기 바랍니다.

엔티티 클래스

다음으로 缓存하고자 하는 데이터를 표현하기 위한 엔티티 클래스를 생성해봅시다. 간단한 Customer 클래스를 idname 필드로 정의합니다.

@Entity @Cacheable @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region = "CustomerRegion") public class Customer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // getters and setters }

Customer 클래스는 @Entity@Cacheable 어노테이션으로 메모리 缓存 가능한 엔티티로 정의합니다. 그리고 id 필드는 @Id@GeneratedValue 어노테이션으로 고유한 아이디를 자동으로 생성하도록 标注되었습니다.

또한 엔티티의 缓存 전략과 리전을 지정하기 위해 @Cache 어노테이션을 사용합니다.

NONSTRICT_READ_WRITE 어노테이션은 Hibernate가 데이터를 읽거나 書き込む 때마다 缓存을 更新하며 이를 결정하는 것을 읽기 및 쓰기를 이해하는 것입니다.

region 속성은 데이터가 저장되는 缓存 리전을 지정합니다.

NCache를 이 리전에 缓存 데이터를 저장하도록 구성합니다.

Hibernate 구성

Hibernate를 데이터베이스와 interactio n하고 缓存을 사용하기 위해 구성해야 합니다.

src/main/resources 디렉터리에 다음과 같은 구성을 갖추는 hibernate.cfg.xml 파일을 생성해봅시다.

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">password</property> <property name="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.show_sql">true</property> </session-factory> </hibernate-configuration>

이 구성 파일에서는 데이터베이스 연결 세부사항, 方言, 및 缓存 설정을 지정합니다. 오라클을 데이터베이스로 사용하고 Hibernate를 스키마를 자동으로 更新하도록 구성합니다.

클라이언트 클래스

클라이언트 클래스를 생성하여 데이터베이스와 캐시 메カ니즘을 integrate하고 실험해봅시다. 하이버네이트를 사용하여 Customer 오브젝트를 저장하고 조회하기 위한 main 클래스를 작성할 수 있습니다.:

public class HibernateClient { public static void main(String[] args) { SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Customer customer = new Customer(); customer.setName("John Doe"); session.save(customer); transaction.commit(); session.close(); session = sessionFactory.openSession(); transaction = session.beginTransaction(); Customer retrievedCustomer = session.get(Customer.class, customer.getId()); System.out.println("Retrieved Customer: " + retrievedCustomer.getName()); transaction.commit(); session.close(); session = sessionFactory.openSession(); transaction = session.beginTransaction(); retrievedCustomer = session.get(Customer.class, customer.getId()); System.out.println("Retrieved Customer: " + retrievedCustomer.getName()); transaction.commit(); session.close(); } }

이 클라이언트 클래스에서, Hibernate 구성을 사용하여 SessionFactory를 생성하고 데이터베이스와 상호 작용하기 위한 세션을 개시합니다. Customer 오브젝트를 데이터베이스에 저장하고 id를 사용하여 이를 조회합니다.

그 다음, 두 개의 구분된 세션에서 retrieveCustomer 方法的을 두 번 호출하여 캐시를 사용하지 않고 데이터베이스 인터섹션을 확인합니다.

이러한 경우 같은 오브젝트를 조회하기 위해 두 번의 데이터베이스 쿼리가 실행되는 것을 확인할 수 있습니다.:

正如你所看到的,Hibernate 쿼리가 두 번 실행되었습니다.

NCache 서버 설정

Hibernate에서 두 번째 수준 캐시로 NCache를 사용하기 위해서는 NCache 서버를 설정하고 캐시 데이터를 저장하기 위한 구성을 수정해야 합니다.

NCache는 Windows와 Linux 서버에서 설치할 수 있는 분산 캐시 솔루션을 제공합니다. 우리는 NCache를 사용하여 캐시 クラ스터를 생성하고 구성할 것입니다. 캐시 클러스터가 설정되면, 자신의 자바 应用程序에서 그 에서 연결할 수 있습니다.Hibernate에서 두 번째 수준 캐시 제공자로 NCache 사용하기

NCache 서버가 설정되면 Hibernate를 두 번째 수준 캐시를 사용하도록 configure할 수 있습니다. Hibernate 구성 파일을 更新하고 캐시 섹션 설정을 指定하여 캐시를 사용하도록 허용할 것입니다.

Cache Regions 사용하기

Cache Regions 사용하기

hibernate.cfg.xml 파일에서 캐시 설정을 更新하여 NCache를 二级 캐시 제공자로 사용할 수 있도록 합니다.:

<hibernate-configuration> <session-factory> <property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.region.factory_class">com.alachisoft.ncache.NCacheRegionFactory</property> ... </session-factory> </hibernate-configuration>

여기서 hibernate.cache.use_second_level_cache 속성을 true 로 설정하여 二级 캐시를 사용할 수 있게 하고, hibernate.cache.region.factory_class 속성을 NCacheRegionFactory로 지정하여 캐시 제공자として 사용할 수 있는 JCacheRegionFactory의 实现을 사용합니다.

NCache 속성 配置

NCache는 Hibernate에서 캐시 설정을 configure하기 위한 一组의 속성을 제공합니다. 这些를 ncache-hibernate.xml 파일에 지정할 수 있습니다.:

<configuration> <application-config application-id="myapp" enable-cache-exception="true" default-region-name="DefaultRegion" key-case-sensitivity="false"> <cache-regions> <region name="CustomerRegion" cache-name="demoCache" priority="AboveNormal" expiration-type="Sliding" expiration-period="8"/> <region name="DefaultRegion" cache-name="demoCache" priority="default" expiration-type="None" expiration-period="0"/> </cache-regions> <database-dependencies> <dependency entity-name="hibernator.BLL.Customer" type="oledb" sql-statement="SELECT CustomerID FROM Customers WHERE CustomerID ='?';" cache-key-format="Customers#[pk]" connection-string="Provider=SQLOLEDB;Data Source=20.200.20.40,1433;Initial Catalog=Northwind;User ID=john;Password=1234;"/> </database-dependencies> </application-config> </configuration>

이 配置 파일에서는 CustomerRegion 캐시 region을 캐시 이름, 우선 级, 만료 형태, 以及 만료 기간을 지정하여 정의합니다. expiration-typeSliding로 설정하고 만료 기간을 8 초로 지정합니다. 这意味着 8 초의 非活动 후에 キャッシュ 데이터가 만료되고 キャッシュ에서 제거됩니다.

또한 DefaultRegion를 지정하여 지정되지 않은 다른 实体에 대한 기본 설정을 갖추고 있습니다. 이것은 명시적으로 configured되지 않은 实体에 대한 allback region로 사용됩니다.

다양한 캐시 region을 갖추는 것은 다양한 实体에 대해 다양한 캐시 설정을 정의할 수 있게 해줍니다.

次に、`Customers` エンティティに `database dependency` を定義します。これは、キャッシュをデータベースと同期させ、データベース内で変更が行われると、キャッシュデータを更新または削除するために使用されます。

SQLステートメントを指定し、`Customers` テーブルから `CustomerID` を取得するためにおよび、データベースに接続するための接続文字列を指定します。

キャッシュキーの書式は、エンティティの主キーに基づいてキャッシュキーを生成する方法を指定します。

テスト

Hibernate内で第二段階のキャッシュとしてNCacheを設定したので、キャッシュがパフォーマンスを改善するかを確認するためにアプリケーションをテストしましょう。クライアントクラスを再び実行し、キャッシングを有効にしてデータベースとのインタラクションを観察します。

クライアントクラスを実行すると、最初の `Customer` オブジェクトの取得呼び出しは、データを取得するためにデータベースにヒットします。しかし、同じオブジェクトを取得する第2の呼び出しは、再度データベースにヒットする代わりにキャッシュから取得するでしょう。これは、キャッシュがデータベースの負荷を減らし、キャッシュからデータを提供することでパフォーマンスを改善する方法を示します。

NCacheをHibernateと共用する利点

Hibernate内で第二段階のキャッシュとしてNCacheを使用することには、いくつかの利点があります。

  • 성능 개선: NCache는 キャッシュデータ用的に高速なメモリ上ストORAGEを提供し、レイテンシを短縮し、スループットを向上させます。また、バックグラウンドでキャッシュを更新する非同期操作も提供しており、アプリケーションのパフォーマンスに影響を与える程度を减らしています。
  • スケール性: アプリケーションがスケールするにつれ、NCacheは水平方向にスケールして、大きな量のデータとユーザーリクエストを処理することができます。クラスタでデプロイすることができ、キャッシュレプリケーションやパーティションなどの機能をサポートして、ロードを分散します。
  • フレキシビリティ: NCacheは様々なキャッシングトポロジーと設定を提供しており、異なるアプリケーション要求に基づいて使用できます。また、キャッシュエリアの使用により、異なるエンティティに基づいて必要なキャッシュ設定が可能で、これにより詳細なキャッシング動作の控制在が可能です。
  • 同期: NCacheはデータベース同期の選択肢を提供し、キャッシュをデータベースと同期させます。これにより、キャッシュされたデータは最新の状態を保ち、データベースで行われた最新の変更が反映されます。

概要

このチュートリアルでは、JavaアプリケーションでHibernateを使用してNCacheを2段階キャッシングとして実装する方法を探りました。

まず、Hibernate、NCache、およびHibernateの2段階キャッシングの基本を理解しました。次に、Javaアプリケーションを設定し、HibernateとNCacheを2段階キャッシングとして構成しました。最後に、実装をテストして、データベースアクセス次数を減らし、キャッシュからデータを提供することでパフォーマンスを改善することを確認しました。

NCache를 Hibernate과 함께 사용하면, 개발자는 분산 缓存의 력을 이용하여 응용 프로그램의 성능, スケーラビリ티, 신뢰성을 향상 시킬 수 있습니다. NCache는 Hibernate 및 다른 자바 프레임웍과 tightly integrated 하며, 자바 응용 프로그램에서 데이터 缓存을 行う 的理想한 선택입니다.

Source:
https://dzone.com/articles/implement-hibernate-second-level-cache-with-ncache