Значение по умолчанию Grails/GORM выбирает стратегию: Когда установить fetchMode на “нетерпеливый”? (нетерпеливый по сравнению с ленивым)

У вас есть весь код для открытия файла, написания верхнего и нижнего колонтитула и повторного закрытия файла, и все это в цикле for итерации по записям, возвращаемым из запроса. На самом деле, если у вас более одной записи, он должен продолжать открывать файл, перезаписывать содержимое новой записью, включая верхний и нижний колонтитулы, и закрывать файл.

Вам нужно открыть файл один раз, написать заголовок, затем перебрать записи и записать каждую, а затем, наконец, написать нижний колонтитул и закрыть файл. Код может выглядеть примерно так:

with open("c:\\test\\test.txt", "w") as feed_file:
    feed_file.write("Name" + "\t" + "Age" )

    for record in cur.fetchall():
        filteredrecord = (record[0] + "\t" + record[1])
        print(filteredrecord)
        feed_file.write("\n" + (filteredrecord))

    feed_file.write("\n" + "ENDOFFILE")

Обратите внимание, что вам не нужно явно закрывать файл при использовании структуры with.

6
задан knorv 17 March 2009 в 15:29
поделиться

1 ответ

В основном ленивая загрузка обладает большим количеством преимуществ, чем нетерпеливая альтернатива (производительность, использование ресурсов). Так как это - установка чаш Грааля по умолчанию для всех отношений (начиная с Grails 1.1), Вы не должны обычно настраивать его для нетерпеливой выборки, если Вы не испытываете определенные вопросы. Такой как:

  • Совместное использование доменного экземпляра через различный в спящем режиме сессии (например, при помещении доменного экземпляра класса в объем сеанса HTTP и доступе к свойствам от него - таким как Пользователь)
  • Получение LazyInitializationException при доступе к доменным экземплярам класса в разметках/представлениях
  • Когда Вы будете уверены, Вы получите доступ к определенному свойству отношения каждый раз (или большую часть времени), когда экземпляр выбирается, также имело бы смысл настраивать это отношение для нетерпеливой выборки.

Нетерпеливая выборка может быть довольно опасной при контакте с огромными базами данных. Вообразите Доменный класс как это:

// really bad example
class TreeNode {

   String name            

   TreeNode parent

   static hasMany = [ childNodes: TreeNode ]

   static mapping {     
      parent lazy: false
      childNodes lazy: false
   }

}

при чтении любого из экземпляров TreeNode это автоматически вытянет все другие экземпляры доменного класса от базы данных в память. Когда будет достаточно экземпляров, Вы, вероятно, уничтожите Вас приложение путем выборки только 1 экземпляра.

16
ответ дан 8 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: