squeryl에서 쿼리를 만들면 쿼리 [T] 개체를 반환합니다. 쿼리는 아직 실행되지 않았으며 쿼리 개체 (Query [T]가 Iterable [T]를 확장)를 반복 할 때 실행됩니다.Squeryl : 명시 적으로 쿼리 실행
쿼리 실행 주위에는 트랜잭션 {} 또는 inTransaction {} 블록이 있어야합니다.
나는 단지 SELECT 쿼리에 대해 말하고 트랜잭션은 필요하지 않지만 squeryl 프레임 워크에는 이러한 쿼리가 필요합니다.
내 응용 프로그램의 모델에서 쿼리를 만들고이를 템플릿에있는 뷰 도우미가 반복하고 데이터를 표시하는보기로 직접 전달하고 싶습니다. 이것은 컨트롤러에 트랜잭션 {} 블록을 넣을 때만 가능합니다 (컨트롤러는 템플릿 호출을 포함하므로 반복을 수행하는 템플릿도 내부에 있습니다). 모델이 실제로 쿼리를 실행하지 않기 때문에 트랜잭션 {} 블록을 모델에 넣을 수 없습니다.
그러나 제 이해에는 거래가 컨트롤러와 관련이 없습니다. 어떤 데이터베이스 프레임 워크를 사용할 것인지, 어떻게 사용할 것인지 그리고 어디에서 트랜잭션을 사용할 것인지 모델의 결정입니다. 그래서 트랜잭션 {} 블록이 모델에 있어야합니다.
Query [T] 인스턴스를 반환하는 대신이 Query [T] 객체에 Iterable [T] .toList를 호출 한 다음 생성 된 목록을 반환 할 수 있음을 알고 있습니다. 그러면 전체 쿼리가 모델에서 실행되고 모든 것이 정상입니다. 그러나 데이터베이스에서 요청한 모든 데이터가이 목록에 캐시되어야하므로이 방법이 마음에 들지 않습니다. 이 데이터가 뷰에 직접 전달되는 방식을 선호합니다. 결과가 컸을 때 결과를 스트리밍하는 MySql 기능을 좋아합니다.
가능성은 있습니까? 아마도 요청을 데이터베이스로 보내고, 트랜잭션을 닫을 수 있지만 여전히 MySQL 스트리밍 기능을 사용하고 나머지 (선택된 고정 된) 결과 집합을 수신하는 Query [T] .executeNow() 함수와 같은 것일 수 있습니다. 접근 했어? 결과 집합은 쿼리하는 순간에 고정되므로 트랜잭션을 닫는 것이 문제가되어서는 안됩니다. 나는 여기에서 볼
흥미롭고 놀라운 것을 발견하면 솔루션을 게시하면 좋을 것입니다. –