உங்களுக்கு ஏன் வினவல் கேச் தேவை

HQL இல் பணியாளர்களைப் பெறுவதன் மூலம் எங்கள் உதாரணத்தை மீண்டும் எழுதுவோம்:

Employee director1 = session.createQuery("from Employee where id = 4").uniqueResult();
Employee director2 = session.createQuery("from Employee where id = 4").uniqueResult();

assertTrue(director1 != director2);

அத்தகைய வினவல்களின் முடிவுகள் முதல் அல்லது இரண்டாம் நிலை கேச் மூலம் சேமிக்கப்படாது .

வினவல் தற்காலிக சேமிப்பை இங்குதான் பயன்படுத்த முடியும் . இது இயல்பாகவும் முடக்கப்பட்டுள்ளது. அதை இயக்க, பின்வரும் வரியை உள்ளமைவு கோப்பில் சேர்க்கவும்:

<property name="hibernate.cache.use_query_cache" value="true"/>

ஆனால் இது பாதி தீர்வுதான். வினவல் தற்காலிக சேமிப்பை இயக்கியுள்ளோம், ஆனால் எந்த வினவல் முடிவுகளை கேச் செய்ய விரும்புகிறோம் என்பதையும் குறிப்பிட வேண்டும். இது வினவலில் எழுதப்பட வேண்டும்:

Query query = session.createQuery("from Employee where id = 4");
query.setCacheable(true);
Employee director1 = query.uniqueResult();

வினவல் கேச் இரண்டாம் நிலை கேச் போன்றது. ஆனால், அது போலல்லாமல், இங்கே கேச் தரவுக்கான திறவுகோல் பொருள் அடையாளங்காட்டி அல்ல, ஆனால் வினவல் அளவுருக்களின் தொகுப்பாகும். மேலும் தரவு என்பது வினவல் அளவுகோல்களுடன் பொருந்தக்கூடிய பொருட்களின் அடையாளங்காட்டிகளாகும். எனவே, இந்த தற்காலிக சேமிப்பை இரண்டாம் நிலை கேச் உடன் பயன்படுத்துவது பகுத்தறிவு.

தற்காலிக சேமிப்பை அழிக்கிறது

தற்காலிக சேமிப்பில் பணிபுரியும் போது முக்கியமான பணிகளில் ஒன்று, தற்காலிக சேமிப்பில் உள்ள பொருள்கள் மாறுவதை உறுதிசெய்து அவற்றை தற்காலிக சேமிப்பிலிருந்து அகற்றுவது (அல்லது அவற்றைப் புதுப்பிக்கவும்). ஹைபர்னேட் இதை நன்றாக செய்கிறது. சில நேரங்களில் அவர் "எந்தவொரு புரிந்துகொள்ள முடியாத சூழ்நிலையிலும் தற்காலிக சேமிப்பை அழிக்கவும்" என்ற விதியால் வழிநடத்தப்படுகிறார்.

நீங்கள் HQL வழியாக பயனர் தரவைப் புதுப்பிக்க விரும்புகிறீர்கள் என்று வைத்துக்கொள்வோம்:

Query query = session.createQuery("update Employee set name=’Alex’ where id = 4")
query. executeUpdate();

தரவுத்தளத்தில் என்ன மாறிவிட்டது என்பதை ஹைபர்னேட் சரியாக அறிய முடியாது, ஆனால் நீங்கள் ஒரு பணியாளர் பொருளை மாற்றுகிறீர்கள் என்பதை அது அறியும். எனவே, இந்த வினவலை இயக்கிய பிறகு, Hibernate ஆனது அதன் தற்காலிக சேமிப்பிலிருந்து பணியாளர் வகையின் அனைத்து பொருட்களையும் நீக்கும் .

ஆனால் NativeQuery இன்னும் சிறப்பாக செயல்படுகிறது:

Query nativeQuery = session.createNativeQuery("update employee set name=’Alex’ where id = 4")
nativeQuery.executeUpdate();

தரவுத்தளத்திற்கான சொந்த SQL வினவல் செயல்படுத்தப்பட்டது. இதன் பொருள் தரவுத்தளத்தில் ஏதோ மாற்றம் ஏற்பட்டுள்ளது - கோரிக்கை executeUpdate() முறையில் அழைக்கப்பட்டது . எனவே, இந்த விஷயத்தில், Hibernate அதை பாதுகாப்பாக இயக்கும் மற்றும் அனைத்து வகையான அனைத்து பொருட்களையும் அதன் தற்காலிக சேமிப்பிலிருந்து அகற்றும் .

நீங்கள் அதை எப்படி விரும்புகிறீர்கள்? நீங்கள் ஒரு பாதிப்பில்லாத கோரிக்கையை அழைக்கிறீர்கள், அதற்குப் பதில் ஹைபர்னேட் தற்காலிக சேமிப்பிலிருந்து எல்லா தரவையும் அழிக்கிறது! அடித்தளத்திலிருந்து வேறுபட்ட பொருட்களை அவர் வைத்திருந்ததை விட இது நிச்சயமாக சிறந்தது, ஆனால் அவ்வளவுதான்!

எனவே, ஹைபர்னேட்டின் படைப்பாளிகள் இந்த விஷயத்தில் ஹைபர்னேட்டுக்கு எவ்வாறு உதவுவது என்பதை விரைவாகக் கண்டுபிடித்தனர். தற்காலிக சேமிப்பில் இருந்து எந்த வகை வகையை அகற்ற வேண்டும் என்பதை நீங்கள் கூறலாம்:

Query nativeQuery = session.createNativeQuery("update employee set name=’Alex’ where id = 4");
nativeQuery.unwrap(org.hibernate.SQLQuery.class).addSynchronizedEntityClass(Employee.class);
nativeQuery.executeUpdate();
குறிப்பு . நேட்டிவ் செலக்ட் வினவல்கள் தற்காலிக சேமிப்பை ஃப்ளஷ் செய்யாது , செருகவும், புதுப்பிக்கவும், நீக்கவும், நடைமுறை அழைப்புகள் போன்றவை மட்டுமே.

கைமுறை கேச் கிளியர்

சில காரணங்களுக்காக, தற்காலிக சேமிப்பிலிருந்து ஒரு பொருளை நீங்களே நீக்க விரும்பலாம். இதை வெவ்வேறு வழிகளில் செய்யலாம்.

குறிப்பு . தற்காலிக சேமிப்பில் உள்ள பொருள்கள் பகுதிகள் எனப்படும் குழுக்களில் சேமிக்கப்படும் . இயல்பாக, பிராந்தியத்தின் பெயர் வகுப்பின் பெயரைப் போலவே இருக்கும். எனவே, உங்களிடம் com.codegym.Employee வகையிலான பொருள்கள் இருந்தால் , அவை அனைத்தும் “ com.codegym.employee ” என்ற பெயரில் ஒரு குழுவில் (பிராந்தியத்தில்) சேமிக்கப்படும் .

நீங்கள் தற்காலிக சேமிப்பை அணுகி அதைக் கொண்டு ஏதாவது செய்ய விரும்பினால், SessionFactory ஆப்ஜெக்ட் மற்றும் getCache() முறை மூலம் அதைச் செய்யலாம் :

session.getSessionFactory().getCache().evictQueryRegion("com.codegym.employee”);

எல்லா குழுக்களிலிருந்தும் (பிராந்தியங்கள்) தரவை நீக்க விரும்பினால், பின்வரும் வினவலை இயக்க வேண்டும்:

session.getSessionFactory().getCache().evictAllRegions();

தற்காலிக சேமிப்பிலிருந்து ஒரு பொருளை அகற்ற, நீங்கள் அதன் பெயர் (வகை) மற்றும் ஐடியை அனுப்ப வேண்டும். நீங்கள் இதை இரண்டு வழிகளில் செய்யலாம்:

session.getSessionFactory().getCache().evictEntityData("Employee, 4);

session.getSessionFactory().getCache().evictEntityData(com.codegym.Employee.class, 4);

ஒரு குறிப்பிட்ட பொருள் தற்காலிக சேமிப்பில் உள்ளதா என்பதையும் நீங்கள் சரிபார்க்கலாம்:

session.getSessionFactory().getCache().containsEntity("Employee, 4);
session.getSessionFactory().getCache().containsEntity(com.codegym.Employee.class, 4);