๐ JPA, Mybatis , Dead Lock์ด์
Caused by: org.apache.ibatis.exceptions.PersistenceException:
###Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30008ms.
###The error occurred while executing a query
###Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30008ms.
Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30008ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:696)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:197)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:162)
ํด๋น ์๋ฒ์ maximum-pool-size
๋ 40์ผ๋ก ์ค์ ๋์ด์์ผ๋ฉฐ,
30์ด์ ๋๊ธฐ๋ฅผ ํ์์๋ Connection Pool์ ํ ๋น๋ฐ์ง ๋ชปํ ์ํฉ์ด๋ค.
public void deadLockMethod(){
mybatisSelectMethod();
jpaSelectMethod();
mybatisSelectMethod();
}
์ฆ, ์ ์์ ์ฝ๋์์ Connection Pool์ ๋ฐํํ์ง ์๊ณ ๋ฌดํ์ ๋๊ธฐํ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ํฌ๋ค๊ณ ํ๋จํ์๋ค.
public void deadLockMethod(){
mybatisSelectMethod();
jpaSelectMethod();
mybatisSelectMethod();
}
์ปค๋ฅ์ ํ ์ํธ ์ ์ ๊ฐ ์ผ์ด๋๊ณ ์๋ ์๋น์ค ๋ก์ง์ ๋ณด์์ ๋, ํน๋ณํ ์ ์ ๋ณด์ด์ง ์๋๋ค. ๊ทธ๋ฌ๋, ํ๊ฐ์ง mybatis์ jpa๋ฅผ ํผ์ฉํด์ ์ฌ์ฉ์ค์ธ ๋ก์ง์ธ ์ ์ด ๋์ ๋ด๋ค.
@Transactional ์ด ๊ฑธ๋ ค์์ง ์๊ธฐ ๋๋ฌธ์, ์์ฐจ์ ์ผ๋ก
์ ์์๋ก ์งํ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ค.
MyBatis๋ ๋ด๋ถ์ ์ผ๋ก JDBC ์ปค๋ฅ์ ์ ๊ด๋ฆฌํ์ง ์๊ณ , DataSource๋ฅผ ํตํด ์ปค๋ฅ์ ์ ๊ฐ์ ธ์ด. ์ฆ, Spring์์ ์ค์ ํ ์ปค๋ฅ์ ํ(HikariCP, DBCP ๋ฑ)์ ํตํด ์ปค๋ฅ์ ์ ๊ด๋ฆฌํ๋ค.**
jpa๋ํ ์ปค๋ฅ์ ํ์ ํตํด ์ปค๋ฅ์ ์ ๊ด๋ฆฌํ์ง๋ง, ์์์ฑ ์ปจํ ์คํธ(์ํฐํฐ ๋งค๋์ )์ ๊ถํ์ ์์ํ๋ค. ์คํฐํฐ ๋งค๋์ : ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํ๋ ํต์ฌ ๊ฐ์ฒด
์์์ฑ ์ปจํ ์คํธ์ ์ง์ ๋ฒ์ -> ์์น ์ค ์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ, OSIV ๋ผ๋ ๊ฒ์ ์๊ฒ๋์๋ค.
OSIV๋ View์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ง์ฐ ๋ก๋ฉ ๋ฑ์ ์ด์ ๋ก ์์์ฑ ์ปจํ
์คํธ๋ฅผ ์ง์ํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ ๊ฒ์ด๋ค.
์ฆ, ์์์ฑ ์ปจํ์คํธ(์คํฐํฐ ๋งค๋์ )์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์น ์์ฒญ์ด ๋๋ ๋ ๊น์ง ์ฐ์ฅํ๋ ์ต์
์ด๋ค.
์ด ์ค์ ์ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ณ๋ค๋ฅธ ์ค์ ์ ํ์ง ์์๋ค๋ฉด default
ON
์ํ์ด๋ค.
public void deadLockMethod(){
mybatisSelectMethod(); -- 1
jpaSelectMethod(); -- 2
mybatisSelectMethod(); -- 3
}
๋ค์ ํ๋ฒ ์ ์ฝ๋๋ฅผ ๋ณด์.
ํธ๋ํฝ์ด ๋ชฐ๋ ค ์ปค๋ฅ์ ํ 40๊ฐ๊ฐ ์ ๋ถ ์ ์ ๋์์ ๋๋ฅผ ๊ฐ์ ํ์.
@Service
public class TestServiceImpl implements TestService {
private final MybatisRepo mybatisRepo;
private final JpaRepo jpaRepo;
public TestServiceImpl(MybatisRepo mybatisRepo,
JpaRepo jpaRepo) {
this.mybatisRepo = mybatisRepo;
this.jpaRepo = jpaRepo;
}
public void test() {
// JPA
jpaRepo.somethingRun();
// MyBatis
mybatisRepo.somethingRun();
}
}
์กฐ๊ฑด
์คํ
์ฆ, DB์ปค๋ฅ์ ์ ์ ์์ ์ ์ฐจ์ด๋ง ์๊ธธ ๋ฟ, ๋ฐํ์์ ์ ์ฐจ์ด๋ ์๋ค.