문제

데이터베이스와 CRUD 작업 외부에서 제공하는 것에 익숙하지 않습니다.

내 연구로 인해 나를 이끌었습니다 트리거. 기본적으로 트리거가 이러한 유형의 기능을 제공하는 것처럼 보입니다.

(에서 위키 백과)

일반적으로 트리거링이 "화재"를 유발하는 세 가지 트리거 이벤트가 있습니다.

  • 이벤트 삽입 (새 레코드가 데이터베이스에 삽입됨).
  • 업데이트 이벤트 (레코드가 변경됨).
  • 삭제 이벤트 (레코드가 삭제되는 것처럼).

내 질문은 : 레코드가 일종의 트리거 시맨틱을 사용하여 레코드가 업데이트/삭제/삽입 될 때 데이터베이스에서 Java (바람직하게는 변경된 데이터를 포함하여)로 통보 할 수있는 방법이 있습니까?

이 문제에 대한 대체 솔루션은 무엇입니까? 데이터베이스 이벤트를 어떻게들을 수 있습니까?

내가 이것을하고 싶은 주된 이유는 이와 같은 시나리오입니다.:

다른 프로세스에 5 개의 클라이언트 애플리케이션이 있으며 다른 PC에 따라 기존입니다. 모두 공통 데이터베이스 (이 경우 Postgres)를 공유합니다.

한 클라이언트가 DB에서 5 명의 고객이 모두 "관심"을하는 레코드를 변경한다고 가정 해 봅시다. 나는 클라이언트가 고객이 변경을 "통보받을 수있는 방법 (바람직하게는 영향을받는 데이터가 첨부 된 경우)을 생각하려고 노력하고 있습니다. 어떤 간격으로 데이터를 쿼리합니다.

도움이 되었습니까?

해결책

Oracle을 사용하면 테이블에 트리거를 설정 한 다음 트리거가 JMS 메시지를 보내도록 할 수 있습니다. Oracle에는 두 가지 JMS 구현이 있습니다. 그런 다음 JDBC 드라이버를 사용하여 메시지를 '듣는'프로세스를 가질 수 있습니다. 이 방법을 사용하여 응용 프로그램 대 폴링으로 변경 사항을 푸시했습니다. Java 데이터베이스 (H2)를 사용하는 경우 추가 옵션이 있습니다. 현재 응용 프로그램 (SIEM)에는 JMX를 사용하여 변경 이벤트를 게시하는 H2의 트리거가 있습니다.

다른 팁

데이터베이스 (데이터가 포함 된)와 해당 데이터의 이벤트를 혼합하지 마십시오.

트리거는 한 가지 방법이지만 일반적으로 응용 프로그램에 지속성 계층이 있습니다. 이 레이어는 특정 일이 발생할 때 이벤트를 발사하도록 선택할 수 있습니다. JMS 주제를 말하십시오.

트리거는 데이터의 "이벤트"가 아닌 관계형 항목을 운영하고 있기 때문에 마지막 도랑입니다. (예를 들어, "업데이트"는 실제로 "회사 변경 법률 이름"이벤트에 맵핑 할 수 있습니다) DB에 의존하면 삽입 및 업데이트를 실제 이벤트에 다시 매핑해야합니다 .... 당신은 이미 알고 있습니다!

그런 다음 이벤트 스트림 처리와 같은 이러한 알림 위에 다른 물건을 계층화하여 다른 사람들이 관심있는 이벤트를 찾을 수 있습니다.

제임스

흠. 그래서 당신은 postgresql을 사용하고 있으며 이벤트에 대해 "듣고"이벤트가 발생할 때 "알림"을 원하십니까?

http://www.postgresql.org/docs/8.3/static/sql-listen.html http://www.postgresql.org/docs/8.3/static/sql-notify.html

도움이 되었기를 바랍니다!

데이터베이스에서 외부 프로세스를 호출하는 것은 매우 공급 업체입니다.

내 머리 꼭대기에서 :

  • SQLServer는 Trigger에서 CLR 프로그램을 호출 할 수 있습니다.

  • PostgreSQL은 동적으로로드 된 임의의 C 함수를 호출 할 수 있습니다.

  • MySQL은 임의의 C 함수를 호출 할 수 있지만 컴파일해야합니다.

  • Sybase는 설정하면 시스템 호출을 할 수 있습니다.

가장 간단한 작업은 삽입/업데이트/삭제 트리거가 일부 로그 테이블에 항목을 만들고 Java 프로그램이 해당 테이블을 모니터링하도록하는 것입니다. 로그 테이블에있는 좋은 열은 event_code, log_datetime 및 log_msg와 같은 것입니다.

매우 고성능이 필요하거나 100ks의 레코드를 처리 해야하는 경우 충분할 것입니다.

나는 당신이 두 가지를 혼란스럽게 생각합니다. 그들은 둘 다 매우 DB 공급 업체입니다.

첫 번째는 "트리거"라고 부를 것입니다. 트리거가 이것과 다르다고 생각하는 DB 공급 업체가 하나 이상 있다고 확신합니다. 트리거는 테이블에 첨부 할 수있는 서버 측 코드입니다. 예를 들어, 표 X의 모든 업데이트에서 PSQL 저장 프로 시저를 실행할 수 있습니다. 일부 데이터베이스를 사용하면 실제 프로그래밍 언어로, 다른 데이터베이스는 SQL 변형에만 쓸 수 있습니다. 트리거는 일반적으로 합리적으로 빠르고 확장 가능합니다.

다른 하나는 "이벤트"라고 부를 것입니다. 클라이언트 프로그램에서 이벤트 핸들러를 정의 할 수있는 데이터베이스에서 발사하는 트리거입니다. 즉, 클라이언트 데이터베이스에 대한 업데이트가있을 때마다 프로그램에서 Fire UpdateClientSlist. 예를 들어, 파이썬과 파이어 버드 사용은 참조하십시오 http://www.firebirdsql.org/devel/python/docs/3.3.0/beyond-python-db-api.html#database-event-notification

모니터를 사용하겠다는 이전 제안은 다른 데이터베이스를 사용하여이를 구현하는 동등한 방법이라고 생각합니다. 어쩌면 오라클? 다른 답변에 언급 된 MSSQL 알림 서비스는 이것의 또 다른 구현입니다.

데이터베이스가 클라이언트 프로그램에 알리기를 원하는 이유를 정말로 잘 알 수 있습니다. 그렇지 않으면 서버 측 트리거를 고수해야합니다.

당신이 요구하는 것은 사용중인 데이터베이스와 데이터베이스와 통신하는 데 사용하는 프레임 워크에 모두 달려 있습니다.

Hibernate와 같은 것을 지속성 계층으로 사용하는 경우 데이터베이스 안팎으로 레코드를 모니터링하는 데 사용할 수있는 일련의 리스너 및 인터셉터가 있습니다.

여기에 사용중인 데이터베이스에 따라 몇 가지 다른 기술이 있습니다. 한 가지 아이디어는 데이터베이스를 폴링하는 것입니다 (피하려고한다고 확신합니다). 기본적으로 자주 변경 사항을 확인할 수 있습니다.

또 다른 솔루션 (SQL Server 2005를 사용하는 경우)은 알림 서비스를 사용하는 것입니다.이 기술은 SQL 2008에서 대체 된 것으로 추정됩니다 (우리는 아직 순수한 교체품을 보지 못했지만 Microsoft는 공개적으로 이야기했습니다).

Oracle을 사용하는 경우이 점을 확인하십시오 이전 게시물.

이것은 일반적으로 표준 클라이언트/서버 애플리케이션의 것입니다. 모든 인서트/업데이트/삭제가 서버 애플리케이션을 통해 데이터베이스를 수정하면 클라이언트 응용 프로그램이 변경 사항을 훨씬 쉽게 알 수 있습니다.

PostgreSQL을 사용하는 경우들을 수있는 기능이 있습니다. 알림 JDBC 클라이언트에서.

사용자가 레코드를 업데이트 할 가능성과 함께 마지막 업데이트 된 타임 스탬프 열을 사용한 다음 고객이 지속적으로 기록 된 레코드에 대해 로컬 레코드 타임 스탬프를 확인할 수 있도록하는 것이 좋습니다.

콜백/트리거 기능을 추가 할 때의 추가 복잡성은 데이터베이스 백엔드와 사용 된 클라이언트 라이브러리에서 지원하지 않는 한 내 의견으로는 가치가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top