<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Комментарии / Профиль dmgcodevil]]></title>
    <link>https://habr.com/ru/users/dmgcodevil/comments/</link>
    <description><![CDATA[Хабр: комментарии пользователя dmgcodevil]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Fri, 24 Apr 2026 03:47:36 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      

      
        
  
    <item>
      <title>24.12.2014 19:22:27 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/246675/#comment_8195387</guid>
      <link>https://habr.com/ru/articles/246675/#comment_8195387</link>
      <description><![CDATA[<blockquote>Интересно, если доступ к полю происходит много раз, все эти вызовы равнозначно залоггируются, хотя нагрузка только при первом вызове?</blockquote><br/>
<br/>
да, поля по lazy инициализируются только при первом вызове, но только для того же объекта. Если объект новый, то lazy загрузка снова отработает для тех же самых полей. В логах видно, что запрос был инициирован из за lazy-loading'a, но тут вопрос: <i>был ли это неоптимальный вызов или же он был осмысленным?</i>. Были места на страницах где происходила загрузка ради того что бы просто достать id или name, а эти поля уже есть в рутом объекте, так что нет смысла грузить лишние данные. <br/>
<br/>
<blockquote>Неплохо, если бы логгер обращения к базе фиксировал бы также stack trace. Тогда, сгруппировав по трейсам, можно вычислить, откуда чаще всего приходят lazy-подгрузки.</blockquote><br/>
Да я думал об этом, но опять же эти логи надо как-то обрабатывать и делать это таким образом, что бы информация была полезной и адекватной. Что бы разработчик взглянул, быстро нашел нужное место и пофиксал проблему. Обработка еще усложняется из за того что в стектрейсах будет куча вызовов из за lazy-loading механизма. На мой взгляд задача нетривиальная, да и результат сомнителен. Кстати jmspy тоже пишет стектрейсы, но не особо они нам помогли в нашей проблеме.]]></description>
      <pubDate>Wed, 24 Dec 2014 19:22:27 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>24.12.2014 18:17:50 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/246675/#comment_8195273</guid>
      <link>https://habr.com/ru/articles/246675/#comment_8195273</link>
      <description><![CDATA[По прядку.<br/>
<br/>
Нагрузку создаёт не доступ к объекту, а выполнение SQL. <br/>
В статье я писал про MongoDB, это noSQL база. Понятно что сам вызов метода ничего не стоит, но вызов метода, который обращается к lazy полю приводит к запросу к базе чтобы загрузить данные. У нас все запросы логировались, но по ним было трудно понять, был ли это вызов сделан используя непосредственно репозиторий или же этот метод выл вызван в процессе работы lazy-loading механизма, который так же использует репозитории для загрузки. <br/>
<br/>
Поэтому логично логировать все SQL-запросы и смотреть, какие лишние, а какие можно объединить в один. Т.е. лечить проблему, а не симптомы.<br/>
<br/>
Мы симптомы не лечили, мы старались избежать вызов lazy полей там где это не нужно и получить информацию о страницах где есть неоптимальные вызовы. <br/>
<br/>
Сами запросы к монге были заимпруваны настолько насколько это было возможно. К слову, репозитории, которые использовали монго не уступали по производительности репозиторям использующим Oracle Coherence для тех же кейсов. Область применения, которую я описал в статье, специфична для нашего проекта и написал я о это что бы показать какая проблема была у нас на проекте и как мы ее решили при помощи разработанной библиотеки. Это скорее для того что бы рассказать как появилась идея создания jmspy. а по факту использовать ее можно в разных целях.]]></description>
      <pubDate>Wed, 24 Dec 2014 18:17:50 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>24.12.2014 13:26:03 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/246675/#comment_8194559</guid>
      <link>https://habr.com/ru/articles/246675/#comment_8194559</link>
      <description><![CDATA[С аспектами не так все просто, так как нужно где-то хранить граф вызовов и прочую информацию. Плюс спринг создает аспекты только для бинов, а у нас домены таковыми не являлись. На самом деле у нас на проекте либа ипользовалась при помощи аспекта: метод репозитория перехватывался аспектом и возвращаемый объект отдавался в MethodInvocationRecorder#record, примерно так:<br/>
<br/>
public Object intercept (final ProceedingJoinPoint pjp) throws Throwable {<br/>
 MethodSignature signature = (MethodSignature) pjp.getSignature();<br/>
 return methodInvocationRecorder.record(signature.getMethod(), pjp.proceed()); // start recording<br/>
 }<br/>
]]></description>
      <pubDate>Wed, 24 Dec 2014 13:26:03 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

      

      

    
  </channel>
</rss>
