EJB에서 CREATE SEQUENCE 수행

1938 단어 sequence
EJB 서비스에서 DDL 구문을 사용하여 일련 번호를 만들어야 하는 비즈니스 요구 사항:

 CREATE SEQUENCE sequence_t_TestCategory INCREMENT BY 2 START WITH 10 MAXVALUE 999999999

EJB 서비스 메서드에서 데이터 소스를 가져옵니다. 일반 JDBC는 다음과 같이 수행합니다.

	StringBuilder sb = new StringBuilder();
		sb.append("CREATE SEQUENCE ");
		sb.append("sequence_t_").append(this.runningNumber.getCategory());
		sb.append(" INCREMENT BY ").append(this.step);
		sb.append(" START WITH ").append(this.initValue);
		sb.append(" MAXVALUE ").append(maxVlue);
		LogUtils.getSingleton().info(" sequence : " + sb.toString());
		sqlService.updateBySql(sb.toString(), sessionId);

그러나 실행은 항상 원본 SQL 문장의 실행 이상을 보고합니다.

java.sql.SQLSyntaxErrorException: ORA-02089: COMMIT  

다음에 자료를 찾아서 문제를 발견한 이유는 DDL 창설 문장을 실행할 때 COMMIT를 기본적으로 추가하여 제출하기 때문이다.
EJB 에는 기본적으로 트랜잭션 제어가 있습니다. 트랜잭션 제어가 있는 EJB 서비스에서는 수동 트랜잭션 제출을 허용하지 않기 때문에 주입된 SQL을 실행하는 서비스 방법을 트랜잭션에 참여하지 않는 것으로 명시하는 것이 방법입니다. 구체적인 코드는 다음과 같습니다.

@Local(NonTransactionSqlServiceLocal.class)
@Remote(NonTransactionSqlServiceRemote.class)
@Stateless(mappedName="NonTransactionSqlService", name="NonTransactionSqlServiceBean")
@TransactionAttribute(TransactionAttributeType.NEVER)
public class NonTransactionSqlServiceBean extends AbstractSqlService {
	
	@Resource(mappedName = "jdbc/going")
	private DataSource dataSource;

	@Override
	public DataSource getDataSource() {
		return dataSource;
	}
	
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

}

이것은 DDL을 실행하는 EJB에 NonTransaction Sql Service Bean을 주입하여 DDL 문장을 실행하면 문제가 없을 것입니다.

좋은 웹페이지 즐겨찾기