์ฟผ๋ฆฌ ์บ์๊ฐ ํ์ํ ์ด์
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๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฌด์์ด ๋ณ๊ฒฝ๋์๋์ง ์ ํํ ์ ์ ์์ง๋ง Employee ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ์ฟผ๋ฆฌ๋ฅผ ์คํํ ํ Hibernate๋ ์ง์ ์ ํ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์บ์์์ ์ญ์ ํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ NativeQuery๋ ํจ์ฌ ๋ ํฅ๋ฏธ๋กญ๊ฒ ์๋ํฉ๋๋ค.
Query nativeQuery = session.createNativeQuery("update employee set name=โAlexโ where id = 4")
nativeQuery.executeUpdate();
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๊ธฐ๋ณธ SQL ์ฟผ๋ฆฌ๊ฐ ์คํ๋์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฌด์ธ๊ฐ๊ฐ ๋ณ๊ฒฝ๋์์์ ์๋ฏธํฉ๋๋ค. ์์ฒญ์ด executeUpdate() ๋ฉ์๋์์ ํธ์ถ๋์์ต๋๋ค . ๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ Hibernate๋ ์์ ํ๊ฒ ํ๋ ์ดํ๊ณ ์บ์์์ ๋ชจ๋ ์ ํ ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค .
์ด๋์? ๋น์ ์ ๋ฌดํดํ ์์ฒญ์ ํธ์ถํ๊ณ ๊ทธ์ ๋ํ ์๋ต์ผ๋ก Hibernate๋ ์บ์์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์๋๋ค! ์ด๊ฒ์ ๋ฒ ์ด์ค์ ๋ค๋ฅธ ๋ฌผ์ฒด๋ฅผ ๋ณด๊ดํ๋ ๊ฒ๋ณด๋ค ํ์คํ ๋ซ์ง๋ง ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค!
๋ฐ๋ผ์ Hibernate ์ ์์๋ ์ด ๊ฒฝ์ฐ Hibernate๋ฅผ ๋๋ ๋ฐฉ๋ฒ์ ์ ์ํ๊ฒ ํ์ ํ์ต๋๋ค. ์บ์์์ ์ ๊ฑฐํ ์ํฐํฐ ์ ํ์ ์ง์ ํ ์ ์์ต๋๋ค.
Query nativeQuery = session.createNativeQuery("update employee set name=โAlexโ where id = 4");
nativeQuery.unwrap(org.hibernate.SQLQuery.class).addSynchronizedEntityClass(Employee.class);
nativeQuery.executeUpdate();
๋น๊ณ . ๊ธฐ๋ณธ ์ ํ ์ฟผ๋ฆฌ๋ ์บ์๋ฅผ ํ๋ฌ์ํ์ง ์๊ณ ์ฝ์
, ์
๋ฐ์ดํธ, ์ญ์ , ํ๋ก์์ ํธ์ถ ๋ฑ๋ง ์ํํฉ๋๋ค.
์๋ ์บ์ ์ง์ฐ๊ธฐ
ํน์ ํ ์ด์ ๋ก ์บ์์์ ๊ฐ์ฒด๋ฅผ ์ง์ ์ญ์ ํด์ผ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ํ๋ ์ ์์ต๋๋ค.
์ฐธ๊ณ . ์บ์์ ๊ฐ์ฒด๋ region ์ด๋ผ๋ ๊ทธ๋ฃน์ ์ ์ฅ๋ฉ๋๋ค . ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ญ ์ด๋ฆ์ ํด๋์ค ์ด๋ฆ๊ณผ ๋์ผํฉ๋๋ค. ๋ฐ๋ผ์ com.codegym.Employee ์ ํ์ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ์ฒด๊ฐ " com.codegym.employee " ๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ทธ๋ฃน(์ง์ญ)์ ์ ์ฅ๋ฉ๋๋ค .
์บ์์ ์ก์ธ์คํ์ฌ ๋ฌด์ธ๊ฐ๋ฅผ ์ํํ๋ ค๋ฉด SessionFactory ๊ฐ์ฒด์ getCache () ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ํํ ์ ์์ต๋๋ค .
session.getSessionFactory().getCache().evictQueryRegion("com.codegym.employeeโ);
๋ชจ๋ ๊ทธ๋ฃน(์ง์ญ)์์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ค๋ฉด ๋ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํด์ผ ํฉ๋๋ค.
session.getSessionFactory().getCache().evictAllRegions();
์บ์์์ ํ๋์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด ์ด๋ฆ(์ ํ)๊ณผ ID๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. ๋ค์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ด ์์ ์ ์ํํ ์ ์์ต๋๋ค.
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);
GO TO FULL VERSION