저장 프로 시저로 업데이트 할 때 NHibernate가 메모리 내 상태를 반영하지 않는 이유는 무엇입니까?

Marcusstarnes

데이터베이스에 대해 쿼리를 실행하는 데 사용하는 NHibernate 세션이있는 프로세스가 있습니다. 그런 다음 결과 컬렉션을 반복하고 동일한 NHibernate 세션을 사용하여 각 반복에 대해 SQL 저장 프로 시저 ( CreateSQLQuery()& 사용 ExecuteUpdate())를 호출하여 해당 엔터티에 대한 필드에서 업데이트를 수행합니다.

목록을 반복하고 SP를 x 번 호출하면 SSMS에서 직접 데이터베이스를 확인하면 각 행에 대한 UPDATE가 적용되었음을 알 수 있습니다.

그러나 내 코드에서 동일한 초기 쿼리를 즉시 다시 실행하여 해당 엔터티 목록을 검색하면 SP가 각 행에 대해 만든 업데이트가 반영되지 않습니다. 값은 여전히 ​​NULL입니다.

내 응용 프로그램에서 NHibernate의 구성에 대해 지정된 캐시 동작을 SetCacheMode()얻지 않았고 쿼리를 호출 할 때 다르게 실험 했지만 아무 차이가없는 것 같습니다. DB에서 직접 볼 수있는 값이 업데이트되었습니다. Session.QueryOver()동일한 세션을 사용하여 데이터베이스 를 다시 쿼리 (사용 ) 할 때 업데이트 된 것으로 다시 가져 오지 않습니다 .

아밋 조시

CreateSQLQuery(데이터베이스를 업데이트하기 위해 단일 행 또는 여러 행은 중요하지 않음) 을 호출 하면 실제로 메모리 내 상태를 업데이트하지 않는 DML 스타일 작업수행하고 있습니다.
모든 호출에 CreateSQLQuery또는 CreateQuery사용하지 않습니다 / 추적을 반영합니다. 이는 작업 단위 범위를 벗어난 것으로 간주됩니다.
이러한 작업은 메모리 내 상태를 무시하고 기본 데이터베이스에 직접적인 영향을줍니다.

14.3. DML 스타일 작업
이미 논의했듯이 자동적이고 투명한 개체 / 관계형 매핑은 개체 상태 관리와 관련이 있습니다. 이는 객체 상태를 메모리에서 사용할 수 있음을 의미 하므로 데이터베이스에서 직접 데이터를 조작 (SQL DML (Data Manipulation Language) 문 : INSERT, UPDATE, DELETE 사용)해도 메모리 내 상태에 영향을주지 않습니다 . 그러나 NHibernate는 Hibernate Query Language (HQL)를 통해 수행되는 대량 SQL 스타일 DML 문 실행을위한 방법을 제공합니다. Linq 구현도 사용할 수 있습니다.

그들은 대량 데이터에 대해 작업 할 수 있습니다. 성능상의 이유로 일부 시나리오에서 필요합니다. 이 경우 추적이 작동하지 않습니다. 예, 메모리 내 상태가 무효화됩니다. 신중하게 사용해야합니다.

그런 다음 즉시 동일한 초기 쿼리를 다시 실행하여 해당 항목 목록을 검색하면 SP가 각 행에 대해 수행 한 업데이트를 반영하지 않습니다. 값은 여전히 ​​NULL입니다.

이는 첫 번째 (세션) 수준 캐시 때문입니다. 이것은 항상 기본적으로 활성화되어 있으며로 비활성화 할 수 없습니다 ISession.

이 때 첫 번째 개체를로드, 자사의 데이터베이스를했다. 데이터베이스 에서 개체 가져 와서 루프를 통해 작업 단위를 벗어난 명령을 실행하고 (위에 설명 된대로) 동일한 쿼리를 다시 두 번 실행 하여 동일한 ISession인스턴스 에서 동일한 개체를로드 합니다. 두 번째 호출 은 데이터베이스 에 전혀 영향을 주지 않습니다 .

메모리에서 인스턴스를 반환합니다. 인 메모리 인스턴스는 전혀 업데이트되지 않으므로 항상 원본 인스턴스를 얻습니다.

업데이트 된 인스턴스를 가져 오려면 첫 번째 세션을 닫고 새 세션으로 인스턴스를 다시로드하십시오.

자세한 내용은 다음을 참조하십시오. Hibernate Query Cache는 어떻게 작동합니까?

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관