Как использовать второй кэш уровня для ленивых загруженных наборов в, в спящем режиме?

Скажем, у меня есть два объекта, Employee и Skill. У каждого сотрудника есть ряд навыков. Теперь, когда я загружаю навыки лениво через Employee экземпляры кэш не используются для навыков в различных экземплярах Employee.

Давайте Рассмотрим следующий набор данных.

Employee - 1 : Java, PHP
Employee - 2 : Java, PHP

Когда я загружаю Сотрудника - 2 после Сотрудника - 1, я не хочу, в спящем режиме для удара базы данных, чтобы получить навыки и вместо этого использовать Skill экземпляры, уже доступные в кэше. Действительно ли это возможно? Раз так, как?

Будьте в спящем режиме конфигурация

<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.password">pass</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost/cache</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>

    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.use_query_cache">true</property>
    <property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
    <property name="hibernate.show_sql">true</property>

    <mapping class="org.cache.models.Employee" />
    <mapping class="org.cache.models.Skill" />
</session-factory>

Объекты с импортом, методами считывания и Удаленными методами set

@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    public Employee() {
    }

    @ManyToMany
    @JoinTable(name = "employee_skills", joinColumns = @JoinColumn(name = "employee_id"), inverseJoinColumns = @JoinColumn(name = "skill_id"))
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    private List<Skill> skills;
}

@Entity
@Table(name = "skill")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Skill {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;
}

SQL для Загрузки Второго Сотрудника и его Навыков

Hibernate: select employee0_.id as id0_0_, employee0_.name as name0_0_ from employee employee0_ where employee0_.id=?
Hibernate: select skills0_.employee_id as employee1_1_, skills0_.skill_id as skill2_1_, skill1_.id as id1_0_, skill1_.name as name1_0_ from employee_skills skills0_ left outer join skill skill1_ on skills0_.skill_id=skill1_.id where skills0_.employee_id=?

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

8
задан Pascal Thivent 1 May 2010 в 00:46
поделиться

1 ответ

Годами я не использовал Visual Studio для работы с гаджетами. Существует несколько способов отладки гаджетов без него, не так широко. Например, нельзя использовать команду debugger; без соответствующего отладчика, подключенного к процессу. Что можно сделать, так это использовать такую программу, как DebugView , чтобы перехватывать сообщения, выводимые методом System.Debug.outableString () :

function test ()
{
    System.Debug.outputString("Hello, I'm a debug message");
}

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

В качестве альтернативы можно развернуть собственные отладочные/скриптовые сообщения с помощью window.prompt () . аларм () был отключен для гаджетов, и confirm () переопределен, чтобы всегда возвращать значение true, но они должны были пропустить подсказку () .

function test ()
{
     // execute some code

     window.prompt(someVarToOutput, JSON.stringify(someObjectToExamine));

     // execute some more code
}

Метод JSON.stringify () действительно помогает проверить состояние объекта во время выполнения кода.

Вместо window.prompt можно также использовать функцию MsgBox () :

window.execScript( //- Add MsgBox functionality for displaying error messages
      'Function vbsMsgBox (prompt, buttons, title)\r\n'
    + ' vbsMsgBox = MsgBox(prompt, buttons, title)\r\n'
    + 'End Function', "vbscript"
);

vbsMsgBox("Some output message", 16, "Your Gadget Name");

Наконец, можно обнаружить все ошибки в сценарии с помощью обработчика событий window.onerror .

function window.onerror (msg, file, line)
{
    // Using MsgBox
    var ErrorMsg = 'An error has occurred'+(line&&file?' in '+file+' on line '+line:'')+'.  The message returned was:\r\n\r\n'+ msg + '\r\n\r\nIf the error persists, please report it.';
    vbsMsgBox(ErrorMsg, 16, "Your Gadget Name");

    // Using System.Debug.outputString
    System.Debug.outputString(line+": "+msg);

    // Using window.prompt
    window.prompt(file+": "+line, msg);        

    // Cancel the default action
    return true;
}

Событие window.onerror даже позволяет вывести номер строки и файл (только с точностью до IE8), в котором произошла ошибка.

Удачи с отладкой, и не забудьте оставить ни в одном window.prompts или MsgBox при публикации гаджета!

-121--3545555-

Как создатель CharingSearch, возможно, я могу дать вам некоторые рассуждения о том, почему я пошел вперед и создал его в первую очередь:).

Использование чистой Lucene является сложной задачей. Есть много вещей, о которых нужно позаботиться, если вы хотите, чтобы он действительно работал хорошо, а также, его библиотека, поэтому без распределенной поддержки, это просто встроенная библиотека Java, которую вы должны поддерживать.

С точки зрения удобства использования Lucene, когда (почти 6 лет) я создал Compass. Его целью было упростить использование Lucene и сделать повседневную Lucene проще. Что я сталкивался раз за разом, так это требование иметь возможность распространения Compass. Я начал работать над ним в Compass, интегрируясь с сетками данных, такими как GigaSpaces, когерентность и Terracotta, но этого недостаточно.

В своей основе распределенное решение Lucene должно быть разделено. Кроме того, с развитием HTTP и JSON в качестве повсеместных API, это означает, что решение, что множество различных систем с различными языками могут быть легко использованы.

Вот почему я пошел вперед и создал поиск. Он имеет очень продвинутую распределенную модель, говорит на языке JSON и предоставляет множество расширенных функций поиска, которые легко выражаются через JSON DSL.

Solr также является решением для раскрытия сервера индексации/поиска через HTTP, но я бы утверждал, что SharingSearch обеспечивает гораздо превосходную распределенную модель и простоту использования (хотя в настоящее время отсутствуют некоторые функции поиска, но ненадолго, и в любом случае, план состоит в том, чтобы включить все функции Compass в поиск). Конечно, я предвзято отношусь, так как создал CharingSearch, так что вам может понадобиться проверить себя.

Что касается Сфинкса, я не использовал его, поэтому не могу комментировать. Я могу сослаться на этот поток на форуме Sphinx , который, я думаю, доказывает превосходную распределенную модель поиска.

Конечно, функция поиска имеет гораздо больше возможностей, чем просто распространяется. На самом деле он построен с учетом облака. Можно проверить перечислять элементов на сайте.

-121--1807069-

Необходимо кэшировать ассоциацию Employe-- < > Навыки . Пример из раздела Ускорение гибернации приложений с кэшированием второго уровня ниже:

<hibernate-mapping package="com.wakaleo.articles.caching.businessobjects">
    <class name="Employee" table="EMPLOYEE" dynamic-update="true">
        <meta attribute="implement-equals">true</meta>    

      <id name="id" type="long" unsaved-value="null" >
            <column name="emp_id" not-null="true"/>
            <generator class="increment"/>
      </id>

    <property column="emp_surname" name="surname" type="string"/>
    <property column="emp_firstname" name="firstname" type="string"/>

    <many-to-one name="country"
            column="cn_id"
                class="com.wakaleo.articles.caching.businessobjects.Country"  
            not-null="true" />

    <!-- Lazy-loading is deactivated to demonstrate caching behavior -->    
    <set name="languages" table="EMPLOYEE_SPEAKS_LANGUAGE" lazy="false">
        <cache usage="read-write"/>
        <key column="emp_id"/>
            <many-to-many column="lan_id" class="Language"/>
    </set>                              
    </class>
</hibernate-mapping>

Обратите внимание на элемент < cache > внутри языков.

4
ответ дан 6 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

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