[Mybatis] SqlSession 동기화(Synchronization) 예제
SqlSession 동기화를 통해 MyBatis에서의 다중 스레드 환경에서 안전하게 데이터베이스 세션을 사용할 수 있습니다. SqlSession을 스레드 간에 안전하게 공유하려면 Java의 ThreadLocal
을 사용하는 것이 일반적입니다. 아래는 SqlSession 동기화 예제입니다.
예제: SqlSession 동기화
- SqlSessionFactory 생성:
먼저 SqlSessionFactory를 생성합니다.
public class MyBatisUtil {
private static final String resource = "mybatis-config.xml";
private static SqlSessionFactory sqlSessionFactory;
static {
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}`
- SqlSession 동기화 설정:
ThreadLocal
을 사용하여 SqlSession을 스레드별로 관리합니다.
public class MyBatisThreadLocal {
private static final ThreadLocal<SqlSession> sqlSessionThreadLocal = ThreadLocal.withInitial(() -> null);
public static SqlSession getSqlSession() {
SqlSession sqlSession = sqlSessionThreadLocal.get();
if (sqlSession == null) {
sqlSession = MyBatisUtil.getSqlSessionFactory().openSession();
sqlSessionThreadLocal.set(sqlSession);
}
return sqlSession;
}
public static void closeSqlSession() {
SqlSession sqlSession = sqlSessionThreadLocal.get();
if (sqlSession != null) {
sqlSession.close();
sqlSessionThreadLocal.remove();
}
}
}`
- SqlSession 사용 및 동기화:
public class Main {
public static void main(String[] args) {
try {
// SqlSession 가져오기
SqlSession sqlSession = MyBatisThreadLocal.getSqlSession();
// MyBatis 매퍼 인터페이스 가져오기
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 데이터베이스 작업 수행
User user = userMapper.getUserById(1);
System.out.println("User: " + user);
} finally {
// SqlSession 닫기 (반드시 닫아야 함)
MyBatisThreadLocal.closeSqlSession();
}
}
}`
위의 예제에서 MyBatisThreadLocal
클래스를 사용하여 SqlSession을 가져오고, 사용이 끝나면 반드시 닫아야 합니다. 각 스레드에 대해 별도의 SqlSession이 생성되고 관리되므로 스레드 간에 데이터베이스 세션을 안전하게 공유할 수 있습니다.
SqlSession을 스레드별로 관리함으로써 MyBatis를 다중 스레드 환경에서 안전하게 사용할 수 있습니다.