ibatis DAO 사무
public class OrderService {
private DaoManager daoManager;
private OrderDao orderDao;
public OrderService() {
daoManager = DaoConfig.getDaoManager();
orderDao = (OrderDao) daoManager.getDao(OrderDao.class);
}
public void method() {
try {
// a separate transaction
orderDao.method1(); //
daoManager.startTransaction(); //
orderDao.method1();
orderDao.method2();
daoManager.commitTransaction();//
} finally {
daoManager.endTransaction();
}
}
}
method () 방법 에는 두 가지 사무 가 있 습 니 다. 방법 에서 dao Manager. startTransaction () 을 명시 적 으로 호출 하지 않 으 면 모든 DAO 의 한 번 방법 호출 은 독립 된 사무 입 니 다. ibatis DAO 사무, 두 개의 핵심 인터페이스 Dao Transaction Manager 와 Dao Transaction 이 있 습 니 다. 서로 다른 데이터베이스 지구 층 의 실현 에 대응 하고 두 인 터 페 이 스 는 서로 다른 실현 에 대응 하고 있다. ibatis 코드 를 보면 이 manager 들 이 사 무 를 실현 하 는 것 이 바로 트 랜 잭 션 소스 를 호출 하 는 트 랜 잭 션 방법 임 을 알 수 있 습 니 다. JdbcDaoTransactionManager
public void commitTransaction(DaoTransaction trans) {
((JdbcDaoTransaction) trans).commit();
}
JdbcDaoTransaction
public JdbcDaoTransaction(DataSource dataSource) {
try {
connection = dataSource.getConnection();
if (connection == null) {
throw new DaoException("Could not start transaction. Cause: The DataSource returned a null connection.");
}
if (connection.getAutoCommit()) {
connection.setAutoCommit(false);
}
if (connectionLog.isDebugEnabled()) {
connection = ConnectionLogProxy.newInstance(connection);
}
} catch (SQLException e) {
throw new DaoException("Error starting JDBC transaction. Cause: " + e);
}
}
public void commit() {
try {
try {
connection.commit();
} finally {
connection.close();
}
} catch (SQLException e) {
throw new DaoException("Error committing JDBC transaction. Cause: " + e);
}
}
그러면 Dao TransactionManager 는 어떤 근거 로 업 무 를 처리 합 니까?DaoTransactionState DaoTransactionState 의 코드 를 보 세 요. 아주 간단 합 니 다. 네 개의 상수 로 업무 가 서로 다른 상 태 를 표시 합 니 다.
public static final DaoTransactionState ACTIVE = new DaoTransactionState();
public static final DaoTransactionState INACTIVE = new DaoTransactionState();
public static final DaoTransactionState COMMITTED = new DaoTransactionState();
public static final DaoTransactionState ROLLEDBACK = new DaoTransactionState();
그렇다면 실제 프로그램 에 서 는 어떻게 사 무 를 통제 합 니까? 첫 번 째 코드 에서 우 리 는 이렇게 DAO 를 얻 었 다. orderDao = (OrderDao) daoManager.getDao(OrderDao.class); 실제 daoManager 가 되 돌아 오 는 것 은 orderdao 의 구체 적 인 실현 클래스 가 아 닙 니 다. 되 돌아 오 는 DaoProxy DaoProxy 입 니 다.
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if (PASSTHROUGH_METHODS.contains(method.getName())) {
try {
result = method.invoke(daoImpl.getDaoInstance(), args);
} catch (Throwable t) {
throw ClassInfo.unwrapThrowable(t);
}
} else {
StandardDaoManager daoManager = daoImpl.getDaoManager();
DaoContext context = daoImpl.getDaoContext();
if (daoManager.isExplicitTransaction()) {
// Just start the transaction (explicit)
try {
context.startTransaction();
result = method.invoke(daoImpl.getDaoInstance(), args);
} catch (Throwable t) {
throw ClassInfo.unwrapThrowable(t);
}
} else {
// Start, commit and end the transaction (autocommit)
try {
context.startTransaction();
result = method.invoke(daoImpl.getDaoInstance(), args);
context.commitTransaction();
} catch (Throwable t) {
throw ClassInfo.unwrapThrowable(t);
} finally {
context.endTransaction();
}
}
}
return result;
}
이 코드 를 보면 잘 알 수 있 습 니 다. DAO 를 호출 하 는 방법 이 있 을 때마다 dao Manager. startTransaction () 을 명시 적 으로 호출 하지 않 으 면 단독 사무 가 됩 니 다.ibatis 가 제공 하 는 터치 보드 JdbcDao Template 를 다시 보 겠 습 니 다.
protected Connection getConnection() {
DaoTransaction trans = daoManager.getTransaction(this);
if (!(trans instanceof ConnectionDaoTransaction)) {
throw new DaoException("The DAO manager of type " + daoManager.getClass().getName() +
" cannot supply a JDBC Connection for this template, and is therefore not" +
"supported by JdbcDaoTemplate.");
}
return ((ConnectionDaoTransaction) trans).getConnection();
}
ibatis 가 여러 DAO 를 제어 하 는 사 무 는 실제 적 으로 이 DAO 들 이 하나의 DaoTransaction (ThreadLocal), 하나의 Connection 을 공유 하 게 하 는 것 입 니 다. 여 기 는 하나의 사무 원 의 상황 입 니 다. 만약 에 여러 사무 원 간 에 전체적인 업 무 를 완성 하려 면 분포 식 사무 관리 서 비 스 를 성실 하 게 사용 하 는 것 이 좋 습 니 다 (jta)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring에서 DAO가 순환 호출될 때 데이터가 실시간으로 업데이트되지 않는 해결 방법문제를 설명하기 전에 몇 가지 전제 사항을 설명하십시오. Spring의 구성 파일에서 다음과 같은 방식으로 데이터베이스 트랜잭션을 구성했다고 가정하십시오. 현재 UserDao 및 Security Service가 있습...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.