2014-04-30 7 views
0

데이터베이스 테이블이 이고 time과 함께 시작됩니다. 현재 나는이 순간에 예정된 작업이 있는지 계속 확인하는 연속 스레드를 실행하고 있습니다. 이 메소드는 아무런 예외도 없지만 작업은 절대 실행되지 않습니다. 내가 생각하는 바에 따르면, 나는 부적절한 방식으로 time entry에 대한 테이블을 점검하고 있으며, 2 초 또는 2 초를 그리워한다.테이블과 시간을 맞추는 방법은 무엇입니까?

이것은 내가 뭐하는 거지입니다 : 연속 스레드 실행에 계속 내부

SELECT job FROM mytable where time = new java.sql.Time(new GregorianCalendar().getTimeInMillis()) 

위의 SQL입니다.

시간 입력과 일치하는 올바른 방법입니까?

+0

DB에서 시간대를 사용했는지 여부 –

+0

@ user3145373'timezone' 자료형과'timezone'이 없으면 –

+0

새 Timestamp (new Date(). getTime())을 사용해 보았습니다. –

답변

1

데이터베이스를 지속적으로 폴링하는 것은 불필요하게 비효율적입니다. 가장 빠른 작업의 시작 시간을 데이터베이스에 쿼리 한 다음 작업을 실행할 시간이되면 타이머를 설정하는 것이 훨씬 좋습니다. 예 :

select top(1) * from myTable where time <= current_time // however you get the current time 
    order by time 

그런 다음 작업 시작 시간에서 현재 시간을 뺍니다. 그런 다음 시간을 대기하도록 타이머를 설정할 수 있습니다. 타이머가 시작되면 작업을 시작하고 데이터베이스에 다음 작업을 쿼리하십시오.

시작 시간이 이고 현재 시간이 인 경우 즉시 작업을 시작한 다음 데이터베이스에서 다음 작업을 확인하십시오.

하지만 첫 번째 작업이 시작될 때까지 기다리는 동안 새로운 작업을 처리하는 방법에 대한 문제가 있습니다. 데이터베이스에 작업이없고 새로운 작업이 들어오는 경우에도 가장 좋은 해결책은 데이터베이스에 쿼리 할 수 ​​있도록 새 작업이 들어 왔음을 어떻게 든 알리는 것입니다. 그런 다음 새 작업의 시작 시간이 대기중인 현재 작업 이전 인 경우 기존 타이머를 삭제하고 새 타이머를 설정하여 새 작업, 이전 작업을 기다리고 대기 상태로 되돌립니다.

이 설정은 데이터베이스의 주기적 폴링을 완전히 제거합니다. 새로운 작업이 도착하면 알림에 의존합니다. 프로그램의 구조에 대한 정보가 없으면 코드 작성 방법을 구체적으로 말할 수도없고 상황에 따라 가능하다고 말할 수도 없습니다. 그러나 시스템 설계를 제어 할 수 있다면이 방법을 사용하는 것이 좋습니다.

1

현재 접근 방식이 좋지 않아 부서지기 쉽고 항상 활성 상태 인 스레드에 의존합니다. 스케줄러와 정확하게 일치 시키려고하지 말고 대신 시간이 과거인지 확인하십시오 (1 밀리 세컨드 또는 1 분이 지나지 않아도 상관없이 작업을 시작하면됩니다).

스케줄러 스레드가 1 분에 한 번만 실행되고 시간이 세분화되어 있으면 어떻게됩니까?

대신에 같음이 아닌보다 작거나 같음을 비교하고 상태에 플래그를 추가하거나 작업이 실제로 시작되었을 때를 추적 할 다른 타임 스탬프를 추가하십시오. 같은

뭔가 :

select * from jobs where scheduledStartTime < SYSDATE and actualStartTime == null 

당신이 그냥 시간이 지난이기 때문에 시작해야 알고, 정확히 일치 할 필요 없다 그런 식으로.

주 : StartJob 로직은 actualStartTime을 널이 아닌 값으로 갱신해야합니다.

추신 : 실제로 데이터베이스에서 날짜를 일치 시키려하지만 고해상도 예약이 필요하지 않은 경우 전체 세분성을 저장하지 말고 저장 한 값을 자릅니다. 예를 들어, Oracle에서는 TRUNC (dt, 'MI')를 사용하여 날짜를 분 단위의 값으로 저장합니다. 일치하는 것이 더 간단합니다. 그러나 일반적으로 스케줄러에서 날짜를 정확히 일치시킬 이유가 없으며 대신 범위 논리를 사용하여 일치시킵니다.

관련 문제