데이터베이스에 대해 쿼리를 실행하는 데 사용하는 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] 삭제
몇 마디 만하겠습니다