데이터베이스 연결에서 ThreadLocal 활용
2894 단어 Java 학습
데이터베이스 연결에서 서버의 응답 속도를 높이기 위해 일반적으로 데이터베이스 연결 탱크의 방식으로 데이터베이스 연결을 얻는다.
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 대상을 불러올 필요가 없습니다. 이렇게 하면 코드를 더욱 튼튼하게 할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JWT 인증 방식의 실현1, 우선 서버에서 로그인 요청을 받았을 때 요청 헤더에 영패가 있는지 확인합니다(첫 로그인은 반드시 없습니다).서버는 계정 비밀번호가 모두 통과된 것을 검증하는 상황에서 token(즉 영패)을 생성하여 응답 헤더에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.