쿼리가 오라클 10g을 중단합니다.
저희 소프트웨어에 이상한 문제가 생겼습니다.5년째 생산 중인데 그런 문제는 없었습니다.
문제:
동면을 통해 쿼리를 만들고 개체를 검색하여 수정하는 스프링 작업(스케줄러)이 있습니다.
이것은 몇 년 동안 작동했지만 한 달 전에는 쿼리가 하루에 5-10번 실행됩니다(쿼리는 10분마다 실행됨).작동이 중단되면 서비스를 다시 시작해야 합니다.
다음 코드는 쿼리를 수행합니다.
@SuppressWarnings("unchecked")
public List<Delivery> findScheduledForDelivery(final String inType, final int max, final String benefitType ) {
//getHibernateTemplate().clear();
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session) throws SQLException {
Criteria criteria = session.createCriteria(Delivery.class);
criteria.createAlias("reward","r");
criteria.createAlias("r.customer","c");
criteria.createAlias("c.inNe","i");
criteria.createAlias("r.promotion","p");
criteria.createAlias("benefit","b");
String sqlCustAlias = StringHelper.generateAlias("c", 2);
criteria.add(Expression.disjunction()
.add(Expression.eq("inStatus", INStatus.InterfaceFailure))
.add(Expression.eq("inStatus",INStatus.Initial)));
criteria.add(Expression.le("deliverAt", new Date()));
String dateString = "2000/01/01";
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
Date startDate = new Date();
try {
startDate = dateFormat.parse(dateString);
criteria.add(Expression.ge("deliverAt", startDate));
}
catch(ParseException e) {
e.printStackTrace();
}
String sqlEqual = "decode(delivered,null,0,1) = 0";
criteria.add(Expression.sql(sqlEqual));
sqlEqual = "decode(" + sqlCustAlias + ".deleteDate,null,1,0) = 1";
criteria.add(Expression.sql(sqlEqual));
if(inType != null ) {
for(INType i : INType.values())
if(i.toString().equals(inType)) {
criteria.add(Expression.eq("i.inType", i));
break;
}
}
criteria.add(Expression.eq("p.active", true));
if(benefitType != null) {
if(benefitType.equals("FREECREDIT"))
criteria.add(Expression.disjunction()
.add(Expression.eq("b.type", BenefitType.FREE_CREDIT))
.add(Expression.eq("b.type", BenefitType.FREE_CREDIT_FTAM)));
else if(benefitType.equals("NONFREECREDIT")) {
criteria.add(Expression.conjunction()
.add(Expression.ne("b.type", BenefitType.FREE_CREDIT))
.add(Expression.ne("b.type", BenefitType.OTHER))
.add(Expression.ne("b.type", BenefitType.VOUCHER)));
criteria.add(Expression.isNull("b.md3Profile"));
}
if(max != 0)
criteria.setMaxResults(max);
}
criteria.addOrder( Order.desc("p.priority") );
criteria.addOrder( Order.asc("deliverAt") );
return criteria.list(); <===== hangs here
}
});
}
데이터 소스는 이렇게 정의됩니다(이것이 프로덕션 상에 있어서는 안 된다는 것을 알고 있지만 이것이 작동하는 유일한 방법입니다). Oracle 연결 풀을 사용하려고 했지만 쿼리가 더 자주 중단됩니다.):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="connectionProperties">
<props>
<prop key="tcp.nodelay">yes</prop>
<prop key="delayRowPrefetch">20</prop>
<prop key="defaultBatchSize">5</prop>
</props>
</property>
</bean>
</beans>
사용하는 소프트웨어:
- 봄 1.2.7
- 동면 3.0.5
- Oracle 10.2.0.1(RAC)
- Oracle jdbc 10.1.0.2
- 레드햇 3 EL
- 자바 1.5_06
지금까지 시도한 것:
- Oracle 연결 풀을 데이터 소스로 사용 -> 연결이 중단된 상태에서 실패했습니다.
- used oracle jdbc 10.2.0.5 -> 해결했다고 생각했는데... 몇 시간 후에 다시 중단되었습니다 :(
오라클에는 데이터베이스 잠금이 없습니다
무엇이 문제일까요?
업데이트:
Oracle EM에서:
ADDM 결과:데이터베이스 시간이 많이 소요되는 SQL 문이 발견되었습니다.쿼리는 상당한 데이터베이스 시간을 소비합니다.임팩트 81%.사용자 I/O 대기 시간은 97%입니다.
- 중요한 사용자 I/O 대기를 담당하는 개별 SQL 문이 발견되었습니다.
- 중요한 사용자 I/O 대기를 담당하는 개별 데이터베이스 세그먼트가 발견되었습니다.
- I/O 서브시스템의 처리량은 예상보다 현저히 낮았습니다.
업데이트: (15.03.2011)
현재 이 서비스는 거의 48시간 동안 매달리지 않고 작동합니다.
이것이 문제를 해결할 수 있을지는 의문이지만 코드를 몇 가지 변경했습니다.
했습니다를 했습니다.decode(delivered,null,0,1) = 0
그리고.decode(" + sqlCustAlias + ".deleteDate,null,1,0) = 1
했습니다.is null
진술들.
수 .decode
기능들.
당신은 이것이 단지 우연이라고 생각합니까?
업데이트: (16.03.2011)
alert.log에는 이제 다음과 같은 많은 항목이 표시됩니다.
ORA-01555 caused by SQL statement below (SQL ID: affkpm4j7azc4, Query Duration=232624 sec, SCN: 0x0003.dca70559):
Tue Mar 15 17:43:06 2011
select * from ( select this_.id as id5_, this_.deliverAt as deliverAt68_5_, this_.delivered as delivered68_5_, this_.inDelivery as inDelivery68_5_, this_.lastDeliveryTry as lastDeli5_68_5_, this_.tries as tries68_5_, this_.sentAt as sentAt68_5_, this_.sent as sent68_5_, this_.retry as retry68_5_, this_.inStatus as inStatus68_5_, this_.errorMessage as errorMe11_68_5_, this_.inCvsDelivery as inCvsDe12_68_5_, this_.cvsDelivered as cvsDeli13_68_5_, this_.cvsLastDeliveryTry as cvsLast14_68_5_, this_.cvsTries as cvsTries68_5_, this_.collectedPoints as collect16_68_5_, this_.smsMessage as smsMessage68_5_, this_.inOldStatus as inOldSt18_68_5_, this_.replacedDate as replace19_68_5_, this_.oldMsisdn as oldMsisdn68_5_, this_.deletedDate as deleted21_68_5_, this_.addManualDate as addManu22_68_5_, this_.stornoPromiseDate as stornoP23_68_5_, this_.stornoINDate as stornoI24_68_5_, this_.activationCode as activat25_68_5_, this_.activationExpirationDate as activat26_68_5_, this_.rewardId as rewardId68_5_, this_.benefitId as b
3일 전 세션에서 나온 것 같습니다.232624초!
먼저 이 쿼리가 중단되면 V$SESSION_WAIT를 확인하여 세션이 무엇을 대기하고 있는지 확인합니다.
두번째 관측치:위에서 보여준 코드는 다음 코드를 무시하는 것 같습니다.max
매개 변수:benefitType
매개 변수가 null이(가) 아닙니다.의도적인 건가요?benefitType 매개 변수가 null인 경우에만 쿼리가 "중단"될 수 있습니까?
죄송합니다. Oracle 내에서 올바른 세션을 식별할 수 있는 방법이 있다고 생각했습니다.다음과 같은 쿼리를 시도합니다.
select v2.sid,
v2.module,
substr(v1.sql_text,1,180) sql_text,
v1.rows_processed,
v2.event,
v2.seq#
from v$sqlarea v1, v$session v2
where v1.users_executing > 0
and v2.sql_address (+) = v1.address;
현재 실행 중인 모든 SQL과 관련 세션 ID, 그리고 가능한 경우 어떤 이벤트에서 대기하고 있는지를 보여줍니다.SQL 텍스트를 사용하여 관심 있는 세션을 식별할 수 있어야 합니다.
언급URL : https://stackoverflow.com/questions/5284757/query-hangs-oracle-10g
'source' 카테고리의 다른 글
Excel로 PDF 데이터 및 테이블 스크래핑 (0) | 2023.09.24 |
---|---|
창이 없는 응용프로그램 만들기 (0) | 2023.09.24 |
클랜 포맷이 내 코드를 깨뜨릴 수 있습니까? (0) | 2023.09.24 |
html을 사용하여 Action에 파라미터를 전달하려면 어떻게 해야 합니까?ASP에서 액션().NET MVC? (0) | 2023.09.24 |
c: 공극 크기* (0) | 2023.09.24 |