[Mybatis] SqlSession 동기화(Synchronization) 예제

SqlSession 동기화를 통해 MyBatis에서의 다중 스레드 환경에서 안전하게 데이터베이스 세션을 사용할 수 있습니다. SqlSession을 스레드 간에 안전하게 공유하려면 Java의 ThreadLocal을 사용하는 것이 일반적입니다. 아래는 SqlSession 동기화 예제입니다.

예제: SqlSession 동기화

  1. 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;
    }
}` 
  1. 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();
        }
    }
}` 
  1. 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를 다중 스레드 환경에서 안전하게 사용할 수 있습니다.