我有一个包含10个选择查询的会话。当我提交会话时,所有10个查询是作为单个请求发送的,还是有10次数据库往返?
答案 0 :(得分:4)
使用NHibernate,你可以使用Future,它们可以在一次往返中完成(如果你的数据库驱动程序支持这个)。
Session.QueryOver<Food>().Where(x => x.IsGood).Future<Food>();
Session.QueryOver<Product>().Where(x => x.IsCheap).Future<Product>();
两者都只在往返DB时执行。
的更多信息答案 1 :(得分:1)
在大多数情况下,将有10次往返。模型对象的更新可以留给提交,但不能选择。这是因为在查询返回后,select的结果必须立即可用。实际上,如果正在进行任何延迟加载,则会话必须保持对惰性字段保持打开状态,可以由后续查询填充。
答案 2 :(得分:1)
会话未提交,但事务是。会话是数据库的连接包装器(就NHibernate而言,它甚至更多)并且应该是短暂的生活。当您通过NHibernate发出读取或写入操作时,它当然会发送到数据库,因为您需要同步结果。 当从代码执行写操作时,它也会立即发送到db。如果最后提交此操作,则取决于它是否在事务中执行。
如果您愿意,可以在每次操作后关闭会话。通常,数据库支持连接池,并且为新操作检索新会话并不昂贵。