예외 ORA-08103: 최대 절전 모드의 setfetchsize를 사용하는 데 개체가 더 이상 없습니다.
Hibernate를 사용하고 있습니다.저는 약 1000000개의 레코드를 가져와야 하는데, 그러면 타임아웃 예외가 발생할 것입니다.그래서 사용하고 있습니다.setfetchsize
6000개의 레코드에 대한 작업을 각각의 6000개의 레코드에서 여러 트랜잭션으로 분산합니다.
다 가져가려면 21시간 정도 걸릴 것입니다.
하지만 레코드를 검색하는 동안 누군가가 가져올 레코드 중 하나를 삭제하면 나는 다음과 같이 됩니다.ORA-08103: object no longer exists
.
이제 검색하는 동안 삭제된 개체를 건너뜁니다.어떻게 해야 하나요?
대부분의 경우 커서는 글로벌 임시 테이블(GTT)을 기반으로 열립니다.ON COMMIT DELETE ROWS
선택.그리고 그 원인은ORA-08103: object no longer exists
오류는commit
다음 바로 뒤에 나온 진술.delete
진술.다음은 간단한 예입니다.
SQL> declare
2 type t_recs is table of number;
3 l_cur sys_refcursor; -- our cursor
4 l_rec t_recs;
5
6 begin
7
8 -- populating a global temporary table GTT1 with sample data
9 insert into GTT1(col)
10 select level
11 from dual
12 connect by level <= 1000;
13
14 open l_cur -- open a cursor based on data from GTT1
15 for select col
16 from GTT1;
17
18 -- here goes delete statement
19 -- and
20 commit; <-- cause of the error. After committing all data from GTT1 will be
21 -- deleted and when we try to fetch from the cursor
22 loop -- we'll face the ORA-08103 error
23 fetch l_cur -- attempt to fetch data which are long gone.
24 bulk collect into l_rec;
25 exit when l_cur%notfound;
26 end loop;
27
28 end;
29 /
ORA-08103: object no longer exists
ORA-06512: at line 24
를 사용하여 글로벌 임시 테이블 재작성on commit preserve rows
절을 사용하면 마주보는 것을 두려워하지 않고 해당 테이블을 기반으로 하는 커서에서 데이터를 안전하게 가져올 수 있습니다.ORA-08103:
오류
일주일 동안 고생한 끝에 마침내 문제를 해결했습니다.
솔루션:대부분의 경우 ON COMMIT DELETE ROWS 옵션을 사용하여 작성된 GTT(Global Temporary Table)를 기반으로 커서가 열립니다.그리고 ORA-08103: object not exists error의 원인은 delete 문 바로 뒤에 오는 commit 문입니다.DBA 팀이 커밋 보존 행에 따라 GTT를 변경하는 것에 동의하지 않았기 때문에 Java 서비스 계층에 코드 기반을 추가했습니다[Spring - Programmatic Transaction 구현].
package com.test;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
public class StudentJDBCTemplate implements StudentDAO {
private DataSource dataSource;
private JdbcTemplate jdbcTemplateObject;
private PlatformTransactionManager transactionManager;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
this.jdbcTemplateObject = new JdbcTemplate(dataSource);
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void create(String name, Integer age, Integer marks, Integer year){
TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
String SQL1 = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL1, name, age);
// Get the latest student id to be used in Marks table
String SQL2 = "select max(id) from Student";
int sid = jdbcTemplateObject.queryForInt( SQL2 );
String SQL3 = "insert into Marks(sid, marks, year) " + "values (?, ?, ?)";
jdbcTemplateObject.update( SQL3, sid, marks, year);
System.out.println("Created Name = " + name + ", Age = " + age);
transactionManager.commit(status);
}
catch (DataAccessException e) {
System.out.println("Error in creating record, rolling back");
transactionManager.rollback(status);
throw e;
}
return;
}
public List<StudentMarks> listStudents() {
String SQL = "select * from Student, Marks where Student.id=Marks.sid";
List <StudentMarks> studentMarks = jdbcTemplateObject.query(SQL,
new StudentMarksMapper());
return studentMarks;
}
}
언급URL : https://stackoverflow.com/questions/18747649/exception-ora-08103-object-no-longer-exists-on-using-setfetchsize-of-hibernate
'programing' 카테고리의 다른 글
엑셀 시트로 오늘 날짜를 어떻게 알 수 있습니까? (0) | 2023.09.08 |
---|---|
Angular2 중첩 템플릿 기반 폼 (0) | 2023.09.03 |
웅변가\모델의 차이: get()와 all() (0) | 2023.09.03 |
python: pywintyptes.datetime을 datetime.datetime으로 변환합니다. (0) | 2023.09.03 |
오라클에서 프로시저 내부에 테이블을 만드는 방법은 무엇입니까? (0) | 2023.09.03 |