๋์์ฑ ์ ๋ต
Hibernate์์ 2์ฐจ ์บ์ฑ์ ํ์ฑํํ ํ์๋ Hibernate์ ์ด๋ค Entity ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ์บ์ฑํ ์ง ์ค๋ช ํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด Hibernate๋ Entity ํด๋์ค์ ๋ํ ํน๋ณํ ์ฃผ์ - @Cache๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค . ์:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
์ด ์ฃผ์์ ๋ ๋ฒ์งธ ์์ค ์บ์๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฐ ์ํฐํฐ ์ํฐํฐ์ ๋ํด ์์ฑํด์ผ ํฉ๋๋ค. ์:
@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
private Integer id;
private Set<Task> tasks;
}
Hibernate๋ ์บ์๋ ์ํฐํฐ๊ฐ ๋ค๋ฅธ ์ค๋ ๋์์ ์ก์ธ์ค๋๋ ๊ฒฝ์ฐ 4๊ฐ์ง ๊ฐ๋ฅํ ์ก์ธ์ค ์ ๋ต์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ์ฝ๊ธฐ ์ ์ฉ
- ์ฝ๊ธฐ-์ฐ๊ธฐ
- ์๊ฒฉํ์ง ์์ ์ฝ๊ธฐ-์ฐ๊ธฐ
- ํธ๋์ญ์
์ฝ๊ธฐ ์ ์ฉ. ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋ ๋ฐ์ดํฐ์ ์ ํฉํ ๋์์ฑ ์ ๋ต. Hibernate๋ ๋จ์ํ ์ด๋ฌํ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํฉ๋๋ค. ์ฐธ์กฐ ๋ฐ์ดํฐ๋ก๋ง ์ฌ์ฉํ์ญ์์ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํ ์ด๋ธ์ ์ถ๊ฐ๋๊ธฐ๋ง ํ๊ณ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ ๊ฑฐ๋์ง๋ ์๋ ์ด๋ฒคํธ ๋ชฉ๋ก์ ์ ์งํฉ๋๋ค. Hibernate๋ฅผ ํตํด ์ด ํ ์ด๋ธ๋ก ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฝ๊ธฐ ์ ์ฉ ์บ์ฑ ์ ๋ต์ด ์ ํฉํฉ๋๋ค.
์ฝ๊ธฐ-์ฐ๊ธฐ (์ฝ๊ธฐ-์ฐ๊ธฐ). ์ฃผ๋ก ์ฝ์ ์ ์๋ ๋ฐ์ดํฐ์ ์ด ์ ๋ต์ ์ฌ์ฉํ์ญ์์ค. ๊ทธ๋ฌ๋ Hibernate๋ ์ด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ ์๋๋ฅผ ์ถ์ ํ ๊ฒ์ด์ง๋ง ์ด๋ฌํ ์๋๊ฐ ๋งค์ฐ ๋๋ฌผ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์๊ณ ์์ฃผ ์ฝ๊ฑฐ๋ ์์ฒญ๋๋ ๊ฐ์ฒด๋ฅผ ์ฃผ๋ก ์บ์ํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ฒด์ ๋ํ ์ฝ๊ธฐ-์ฐ๊ธฐ ์ ๋ต์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋น์๊ฒฉ-์ฝ๊ธฐ-์ฐ๊ธฐ . ์ด ์ ๋ต์ ์บ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์๊ณ ์ค๋๋ ๋ฐ์ดํฐ์ ์์ ๊ฐ๋ฅ์ฑ์ด ์ค์ํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
์ฝ๊ธฐ-์ฐ๊ธฐ ์ ๋ต๊ณผ ๋ฌ๋ฆฌ ์ด ์ ๋ต์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๊ฐ ์ฝ๊ธฐ์ฉ์ผ๋ก ์ ๊ฒจ ์์ง ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ก ์ธํด ๊ฐ์ฒด๊ฐ ํ ๊ณณ์์ ๋ณ๊ฒฝ๋๋ ๋์ ๋ค๋ฅธ ๊ณณ์์๋ ๋๊ตฐ๊ฐ๊ฐ ์ด์ ๋ฒ์ ์ ์ฝ๊ณ ์์ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ์์ ์ ๋๊ธ์ ๋ณ๊ฒฝํ์ง๋ง ๋ค๋ฅธ ์ฌ์ฉ์๋ ์ผ๋ง ๋์ ์์ ์ ์ด์ ๋ฒ์ ์ ๊ณ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค๋ฉด nonstrict-read-write ์ ๋ต์ ์ฌ์ฉํ์ญ์์ค.
ํธ๋์ญ์ . ๋๋ฌผ๊ฒ ์ ๋ฐ์ดํธ๋๋ ๋์ ํธ๋์ญ์ ์์ ๋ถ์ค ๋ฐ์ดํฐ๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ด ์ค์ํ ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ์ ์ฃผ๋ก ์ด ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
์บ์์ ๋ฐ์ดํฐ ์ ์ฅ
๊ธฐ์ตํด์ผ ํ ๋ ๋ฒ์งธ ์์ค ์บ์์ ๋ํ ๋ ๋ค๋ฅธ ์ค์ํ ์ธ๋ถ ์ฌํญ์ Hibernate๊ฐ ํด๋์ค ์์ฒด์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฌธ์์ด, ์ซ์ ๋ฑ์ ๋ฐฐ์ด๋ก ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด ์๋ณ์๋ ์ด ์ ๋ณด์ ๋ํ ํฌ์ธํฐ ์ญํ ์ ํฉ๋๋ค. ๊ฐ๋ ์ ์ผ๋ก ์ด๊ฒ์ ๊ฐ์ฒด์ ID๊ฐ ํค์ด๊ณ ๋ฐ์ดํฐ ๋ฐฐ์ด์ด ๊ฐ์ธ ๋งต๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ํ ์ ์์ต๋๋ค.
1 -> { "Ivanov", 1, null , {1,2,5} }
2 -> { "Petrov", 2, null , {1,2,5} }
3 -> { "Sidorov", 3, null , {1,2,5} }
๊ฐ ๊ฐ์ฒด๊ฐ ์ฐจ์งํ๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ณ ๋ คํ๋ฉด ๋งค์ฐ ํฉ๋ฆฌ์ ์ ๋๋ค.
์์ ๋ด์ฉ ์ธ์๋ Entity ํด๋์ค์ ์ข ์์ฑ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์๋์ง ์๋๋ค๋ ์ ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์ ํด๋์ค์ธ Employee๋ฅผ ๊ณ ๋ คํ๋ฉด ๊ฐ์ ธ์ฌ ๋ ์์ ์ปฌ๋ ์ ์ ๋ ๋ฒ์งธ ์์ค ์บ์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ๊ฒ์ ๋ฉ๋๋ค .
์ข ์์ฑ๋ ์บ์ํ๋ ค๋ฉด ํด๋์ค๊ฐ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
private Integer id;
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set<Task> tasks;
}
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง ์ธ๋ถ ์ฌํญ - ๋ ๋ฒ์งธ ์์ค ์บ์์์ ์ฝ๊ธฐ๋ ์ํ๋ ๊ฐ์ฒด๊ฐ ์ฒซ ๋ฒ์งธ ์์ค ์บ์์์ ๋ฐ๊ฒฌ๋์ง ์์ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํฉ๋๋ค.
์บ์ ๋ชจ๋
Hibernate๋ ๋งค์ฐ ์ ์ฐํ ์บ์ฑ ๊ด๋ฆฌ๋ฅผ ํ์ฉํฉ๋๋ค. ๊ฐ ๊ฐ๋ณ ์ธ์ ๋๋ ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฒญ์ ๋ํด ์บ์ ๋ชจ๋๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ 5๊ฐ์ง ๋ชจ๋๊ฐ ์์ต๋๋ค.
- ์ป๋ค
- ๋ฌด์ํ๋ค
- ์ ์
- ๋๋ค
- ์๋ก ๊ณ ์น๋ค
์๋ ํ๋ ๊ทธ๋ค์ ์์ ์ ์ค๋ช ํฉ๋๋ค.
์บ์ ๋ชจ๋ | ์ค๋ช |
---|---|
์ป๋ค | ๋ฐ์ดํฐ๋ ์บ์์์ ์ฝํ์ง๋ง ์ถ๊ฐ๋์ง๋ ์์ต๋๋ค. |
๋ฌด์ํ๋ค | ์ธ์ ์ ์บ์์ ์ํธ ์์ฉํ์ง ์์ต๋๋ค. |
์ ์ | ์บ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์บ์์ ์ถ๊ฐํฉ๋๋ค. |
๋๋ค | ๋ฐ์ดํฐ๋ ์บ์์์ ๊ฐ์ ธ์ค์ง ์๊ณ ์ถ๊ฐ๋ฉ๋๋ค. |
์๋ก ๊ณ ์น๋ค | ๋ฐ์ดํฐ๋ ์บ์์์ ๊ฐ์ ธ์ค์ง ์๊ณ ์ถ๊ฐ๋ฉ๋๋ค. ์ด ๋ชจ๋์์๋ hibernate.cache.use_minimal_puts ์ค์ ์ด ์ถ๊ฐ๋ก ์ฌ์ฉ๋ฉ๋๋ค. |
์ธ์ ์ ๋ํ ์บ์ ๋ชจ๋ ์ค์ ์ ์:
session.setCacheMode(CacheMode.GET);
Employee director = session.createQuery("from Employee where id = 4").uniqueResult();
๋ํ ์ธ์ ๋ฐ ์์ฒญ์ ๋ํ ๋ชจ๋ ์ค์ ์ ์:
session.setCacheMode(CacheMode.GET);
Query query = session.createQuery("from Employee where id = 4");
query.setCacheMode(CacheMode.IGNORE); // Ignore cache work for this request
Employee director = query.uniqueResult();
GO TO FULL VERSION