في هذه الدرسة التعليمية سنستكشف تنفيذ الكاشف الثانوي المرتبط بهيبيرنات باستخدام NCache.
سنقوم بإعداد تطبيق جافا مع Hibernate. ومن ثم سنضبط NCache ككاشف المرتبط الثانوي. وأخيرًا سنفتح التجربة لنرى كيف يخفف الكاشف العمل المرتبط على القاعدة البياناتية وتحسين الأداء.
الأساسيات
قبل أن نغطس في التطبيق، دعونا نفهم الأساسيات ل Hibernate و NCache وكاشف Hibernate المرتبط الثانوي.
Hibernate
Hibernate هو واجهة تواريخ التواصل الفاتوري للبرمجيات الجافا وهي مفتوحة المصدر. تسهم في تسهيل تطوير التواصلات مع القواعد البياناتية عن طريقتواريخ الجافا الأوبجكتي إلى جداول القواعد وعكس ذلك.
لزيادة الأداء، يوفر Hibernate اثنين من الكاشفات:
1. الكاشف الأولي
الكاشف الأولي مرتبط بالجلسة في Hibernate ومفعل بالإفتراض. يتخزن الأشياء التي تم استعيدتها خلال الجلسة ويتم تخليها عن الحاجة إلى القواعد البياناتية مرتين لنفس الأشياء.
الكاشف الأولي محدود بنطاق الجلسة وغير مشترك بين الجلسات.
وليس مستمرًا أيضًا ويُمسك بعد إغلاق الجلسة أو تنظيفها بواسطة الإشارة.
2. الكاشف الثانوي
المخزون الثانوي المشترك يمكن أن يكون مُضاف إلى التخزين على مستوى التطبيق ويساهم في خفض عدد الاصطدامات بالقاعدة البيانات عن طريق تخزين أشياء لمدة أطول.
يتوجب تكوين المخزون الثانوي بوضوح ويمكن تنفيذه بواسطة مزيد من مزودي التخزين المختلفين مثل NCache و Ehcache وغيرهم.
NCache
NCache هي حلول تخزين المخزون التوزيعي لتطبيقات .NET والتطبيقات الجافا. إنها توفر مخزون للبيانات في الذاكرة الذي يمكن استخدامه لتخزين البيانات المتداولة وتحسين أداء التطبيقات.
يدعم NCache أنماط تخزين مختلفة مثل التكاثر، التوزيع والتخزين العميلي.
يمكن استخدام NCache كمخزون الدرجة الثانية في Hibernate لتخزين واسترجاع الأشياء من القاعدة البيانات بدلاً من الاصطدام بالقاعدة.
إعداد الشيكول
دعونا نبدأ بإنشاء تطبيق جافا وتكوين Hibernate للتفاعل مع القاعدة البيانات.
سنستخدم Maven لإدارة ال依存关系 وبناء المشروع. التطبيق سيكون له فئة جافا لتعريف البيانات وجافا للتفاعل مع القاعدة البيانات.
سنبدأ باختبار التطبيق بدون التخزين لرؤية تفاعلات القاعدة البيانات. ثم سنقوم بتكوين NCache كمخزون الدرجة الثانية في Hibernate لتخزين الأجسام الجافا وخفض تفاعلات القاعدة.
ال依存关系
سنبدأ بإضافة المعاملات المطلوبة ل Hibernate و NCache في ملف p
<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>
يرجى ملاحظة أن las versiones mencionadas aquí pueden variar en función de las últimas publicaciones. Asegúrese de utilizar las versiones apropiadas para su proyecto.
Clase de entidad
Después, vamos a crear una clase de entidad para representar los datos que queremos cachear. Definiremos una clase simple Cliente
con campos id
y nombre
:
@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 }
La clase Cliente
está anotada con @Entity
y @Cacheable
para definirla como una entidad cacheable. Tiene un campo id
anotado con @Id
y @GeneratedValue
para generar identificadores únicos automáticamente.
También usamos la anotación @Cache
para especificar la estrategia de caché y la región para la entidad.
NONSTRICT_READ_WRITE
le dice a Hibernate que actualice el caché cuando se lean o escriban datos con eventualidad de consistencia.
El atributo region
especifica la región de caché donde se almacenarán los datos.
Configuraremos NCache para utilizar esta región para almacenar los datos en caché.
Configuración de Hibernate
Necesitamos configurar Hibernate para interactuar con la base de datos y habilitar la caché.
Vamos a crear un archivo hibernate.cfg.xml
en el directorio src/main/resources
con la siguiente configuración:
<?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>
En este archivo de configuración, especificamos los detalles de conexión a la base de datos, el dialecto y la configuración de caché. Utilizamos Oracle como base de datos y configuramos Hibernate para actualizar el esquema automáticamente.
Clase del cliente
نقوم بإنشاء clase 客户端 للتفاعل مع القاعدة البياناتية وتجربة نظام التخزين. يمكننا كتابة clase main
لحفظ واسترجاع Customer
من التفاعلات بواسطة Hibernate:
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(); } }
في هذه ال clase 客户端، نقوم بإنشاء SessionFactory
بواسطة ت配置 Hibernate وفتح sesión للتفاعل مع القاعدة البياناتية. نحن نحفظ معظم Customer
لتواصل مع القاعدة البياناتية ونحصل عليه بواسطة الـid.
ثم نطلب من الـ retrieveCustomer
طريقة مرتين في اثنتين من الsesiones من أجل رؤية التفاعلات بدون التخزين المستدير.
سنلاحظ أن القاعدة البياناتية تتم مراجعتها مرتين للحصول على نفس الجهة:
كما يمكننا رؤية، التعبير الكتابي لـ Hibernate يتم تنفيذه مرتين.
إعداد 服务器 NCache
لإستخدام NCache كـ second-level تخزين في Hibernate، نحن بحاجة إلى إعداد 服务器 NCache وتعيينه لتخزين البيانات المتخزنة.
NCache توفر حلول تخزين توزيعية يمكن تثبيتها على سيرفرات Windows و Linux. سن إنشاء مجموعة تخزين بواسطة NCache ونضبطه. بمجرد إنشاء مجموعة تخزين، يمكننا اتصال إليها من تطبيقاتنا الجافا.
تمكين NCache كـ second-level مزود تخزين في Hibernate
بمجرد إعداد 服务器 NCache، يمكننا تعيين Hibernate لاستخدام NCache كمزود تخزين second-level. سنتحديث ملف ت配置 Hibernate ون SPECIFY 设置 المناطق التي تتم تخزينها.
تمكين المناطق التي تخزين.
لنحدد تنظيم المخزون في ملف 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. يمكننا تحديد هذه في ملف 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
مع اسم المخزون، الأولوية، نوع الانتهاء، وفترة الانتهاء. نضع expiration-type
في Sliding
مع فترة الانتهاء من 8
ثواني. هذا يعني أن البيانات المتمتعة بالمخزون ستافت بعد 8 ثواني من بدون نشاط وستتم إزالتها من المخزون.
أضافة إلى ذلك، نحدد DefaultRegion
مع إعدادات تلقائية للأشياء الأخرى التي لا تمتلك منطقة مخزونية خاصة. يستخدم هذه كمنطقة تأخذ الأساس للأشياء التي لم يتم تكوينها بواسطة المخزون التقصيري.
وإعداد مناطق المخزون المتعددة يسمح لنا بتعيين إعدادات المخزون مختلفة للأشياء المختلفة وفقاً لتوجيهاتها.
في المرحلة التالية نحن نdefini التبعات القاعدة البياناتيةللCustomers
实体. وهذا يستخدم للحفاظ على المخزون في توافر مع القاعدة البياناتية وتحديث/حذف البيانات المخزونية حين يتم إجراء تغييرات في القاعدة البياناتية.
نحن ن especify العبارة الSQL التي تحصل على CustomerID
من جدول Customers
ونسمي الخط للاتصال بالقاعدة البياناتية.
نحن نحدد تنسيق مفاتيح المخزون التي توضح كيف تنتج مفاتيح المخزون عن مفاتيح الكلية الرئيسية للجهة.
تختبر
حينما أنشأنا NCache كمخزون المستوى الثاني في Hibernate، دعونا نختبر التطبيق لرؤية كيفية تحسين الأداء من خلال المخزون. سنقوم بتشغيل تلك الصفقة المستخدمة مرة أخرى ونرا تفاعلات القاعدة البياناتية مع المخزون فعلًا.
حين تشغل الصفقة المستخدمة سيرى أن المجاملة الأولى لتحصيل عنصر Customer
تصل الى القاعدة البياناتية للحصول على البيانات. ومع ذلك سيجلب المجاملة الثانية لتحصيل نفس العنصر ستجلبه من المخزون بدلاً من الذهاب إلى القاعدة البياناتية مجددًا. وهذا يظهر كيف يتسبب المخزون في خفض حملة القاعدة البياناتية وتحسين الأداء من خلال تقديم البيانات من خلال المخزون.
مزايا استخدام NCache مع Hibernate
استخدام NCache كمخزون المستوى الثاني في Hibernate يوفر عدة مزايا:
- أحسن الأداء: NCache يوفر تخزينًا في الذاكرة السريع للبيانات المتوفرة في المخزون، مما يخفض التأخير ويحسن المعدل الإجمالي. ويوفر أيضًا عمليات أسية لتحديث المخزون في الخلفية، مما يخفض تأثير ذلك على أداء التطبيق.
- التنمية: وأثناء تنمية التطبيق، يمكن لNCache التنمية أفقيًا لمعالجة كميات كبيرة من البيانات وال solicitudes المتعقبة. يمكن تنسيقه في مجموعة وتدعم ميزات مثل تكرار المخزون والتنقل البنياتي لتوزيع الحمل.
- المرونة: NCache يوفر مخزونات التخزين المختلفة والإعدادات للاحتياجات المختلفة للتطبيقات. بالإضافة إلى ذلك، وبسبب استخدام المناطق المخزونية، يمكن للأشياء المختلفة أن تمتلك إعدادات المخزون مختلفة وفقاً للحاجات الخاصة بهم. هذا يسمح للسيطرة الدقيقة على سلوك التخزين.
- التزام المتعاون: NCache يوفر خيارًا لتزام القاعدة البياناتية لإحفاظ المخزون بالتزام مع القاعدة البياناتية. هذا يتأكد من أن البيانات المتوفرة في المخزون متعاملة وتعكس التغييرات الأخيرة التي قد يحدث في القاعدة البياناتية.
الخلاصة
في هذا الدرس، قمنا باستكشاف تطبيق المخزون الثانوي المساعد في Hibernate باستخدام NCache للتطبيقات الجافا.
بدأنا بفهم أساسيات Hibernate وNCache والمخزون الثانوي المساعد في Hibernate. ومن ثم أنشأنا تطبيق جا
باستخدام NCache مع Hibernate، يمكن للمطورين تعزيز أداء تطبيقاتهم والقدرة على التنمية والموثوقية بتسخير قوة التخزين الموزع. يوفر NCache حلول تخزين البيانات القوية التي تتكامل بشكل سلس مع Hibernate والبرامج الأخرى الجافا والتي تكون خيارًا مثاليًا لتخزين البيانات في تطبيقات الجافا.
Source:
https://dzone.com/articles/implement-hibernate-second-level-cache-with-ncache