데이터베이스 연결에서 ThreadLocal 활용

2894 단어 Java 학습
이전에는 Thread Local이 쓸모가 없다고 생각했는데, 나중에 다른 사람이 데이터베이스 연결에 대한 설명을 보고 이 종류가 정말 실용적이라는 것을 알게 되었다.
데이터베이스 연결에서 서버의 응답 속도를 높이기 위해 일반적으로 데이터베이스 연결 탱크의 방식으로 데이터베이스 연결을 얻는다.

C3P0Utils 구현

public class C3P0Utils {

	private static DataSource source;// 
	static{
		source = new ComboPooledDataSource("mysql");// 
	}
	
	/**
	 *  
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException{
		return source.getConnection();
	}
}

위의 코드는 C3P0 연결 탱크를 사용하여 데이터베이스 연결을 얻는 도구 클래스입니다. 그 중에서 DataSource는 jdk에 내장된 데이터베이스 연결 탱크 인터페이스입니다. 또한 선회사가 제정한 데이터베이스 연결 탱크에 대한 표준이라고 할 수 있습니다. 모든 데이터베이스 연결 탱크는 이 인터페이스를 실현해야 합니다.

TransactionThreadLocal 구현

public class TransactionThreadLocal {

	private static ThreadLocal tc = new ThreadLocal<>();
	/**
	 *  
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException{
		Connection connection = tc.get();
		if(connection == null){
			connection = C3P0Utils.getConnection();
			tc.set(connection);
		}
		return connection;
	}
	
	/**
	 *  
	 * @throws SQLException
	 */
	public static void startTransaction() throws SQLException{
		getConnection().setAutoCommit(false);
	}
	/**
	 *  
	 * @throws SQLException
	 */
	public static void commit() throws SQLException{
		getConnection().commit();
	}
	
	/**
	 *  
	 * @throws SQLException
	 */
	public static void rollback() throws SQLException{
		getConnection().rollback();
	}
	
	/**
	 *  
	 * @throws SQLException
	 */
	public static void close() throws SQLException{
		getConnection().close();// 
		tc.remove();// connection 
	}
}

이 클래스는 데이터베이스 연결을 조작하는 데 사용되는 도구 클래스입니다.
getConnection() 메서드는 현재 스레드 Connection 객체를 가져오는 방법입니다.ThreadLocal 클래스에는 get () 방법이 있습니다. 이 방법은 현재 스레드에 저장된 ThreadLocal의 대상을 가져오는 데 사용됩니다. 각 스레드에 저장된 것은 이 대상의 복사본입니다. 서로 다른 스레드 사이에는 서로 영향을 주지 않습니다. 한 스레드가 이 대상의 수정에 다른 스레드의 값에 영향을 주지 않습니다.set(T value) 메서드는 현재 스레드에 있는 객체의 값을 설정합니다.
ThreadLocal 대상을 사용하여 Connection 대상을 저장하는 것은 현재 라인의 어느 곳에서든 Connection 데이터베이스 연결이 똑같다는 것을 보장할 수 있는 장점이 있습니다.우리는 데이터베이스 작업에서 업무가 비교적 빈번하게 사용되는 것을 알고 있다. 하나의 업무에는 여러 개의 데이터베이스 작업이 포함되어 있다. 우리는 하나의 업무에서 모든 작업에 사용되는 연결 대상이 같다는 것을 보증해야 한다. 일반적인 상황에서 우리는 연결 대상을 매개 변수로 해당하는 데이터베이스 작업 방법에 전송하는 것을 선택한다. 이렇게 하면 비교적 번거롭다.
public class BookDaoImp implements BookDao{
 @Override
	public void edit(Book book) throws Exception {
		Connection conn = TransactionThreadLocal.getConnection();
		String sql = "update book set name=? where id=?";
		PreparedStatement pst = conn.prepareStatement(sql);
		pst.setString(1, "name");
		pst.setString(2, id);
		pst.execute();
	}
}
위의 클래스 중의edit 방법에 사용된
Connection 대상은 TransactionThreadLocal 클래스의 getConnection () 방법으로 얻을 수 있으며, Connection 대상을 불러올 필요가 없습니다. 이렇게 하면 코드를 더욱 튼튼하게 할 수 있습니다.

좋은 웹페이지 즐겨찾기