powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA много @OneToOne
25 сообщений из 79, страница 3 из 4
JPA много @OneToOne
    #39268574
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
автор1)Про update - ставите @DynamicUpdate(true) - будет обновлять только одно поле ... но... но ..нужно понимать в каких случаях себе в ногу попадете :) Это решение , почему так - потому что Хибер думает что еще кто то где то мог ваш обхект или его поля изменять и перестраховывается и апдейтит все сразу , даже то что вы не меняли
В JPA нету, это хибернейтовское. Мне кажется если включить кэш 2го уровня, то будет без лишних полей.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268607
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczno56892А что там за dirtychecking если вытаскивать для чтения?
Если вытаскивать в read-only, то dirty checking, как раз не будет.

Тут вопрос к старшим коллегам

можно добиться такого эффекта в Хибернейте путем проставления .setReadOnly(true).

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    @Test
    @Commit
    public void dirtyCheckingDisableForQuery() {
        // add @Immutable to Client
        Client client = getSession().get(Client.class, 1);
        // for queries it is also possible
        getSession().createQuery("select c from Client c").setReadOnly(true).list();
    }



а что делать в JPA и spring-data-repository ?
http://javabeat.net/spring-data-repository-read-only-write-only/

Это будет реальная альтернатива и замена Хибернетй подходу ?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268615
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
Опять куча каких-то "левых" аннотаций не к месту... Оно и так не будет делать dirty checking, т.к. если апдейтов нет - он тупо не нужен.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268623
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Чего там в pure JPA сказать не могу. В Spring можно добиться аналогичного эффекта через @Transactional(readOnly=true).
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268628
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Опять куча каких-то "левых" аннотаций не к месту... Оно и так не будет делать dirty checking, т.к. если апдейтов нет - он тупо не нужен.
Дело не в этом. Если у тебя не read-only сессия, то Hibernate будет создавать прокси для dirty checking, когда они не нужны.
А так же будет хранить слепки оригинального состояния сущности, которые тоже не нужны.
Еще одна важная оптимизачия чтения в ORM это FlushMode. У меня как раз вчера коллеги в NHibernate с этим столкнулись, потому что Spring не используют.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268632
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Atum1,
автор1)Про update - ставите @DynamicUpdate(true) - будет обновлять только одно поле ... но... но ..нужно понимать в каких случаях себе в ногу попадете :) Это решение , почему так - потому что Хибер думает что еще кто то где то мог ваш обхект или его поля изменять и перестраховывается и апдейтит все сразу , даже то что вы не меняли
В JPA нету, это хибернейтовское. Мне кажется если включить кэш 2го уровня, то будет без лишних полей.

С чего бы?

вот тест :
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<ehcache>
    <cache name="referenceCache"
           maxElementsInMemory="10000"
           eternal="true"
           timeToIdleSeconds="600"
           timeToLiveSeconds="3600"
           overflowToDisk="false">
    </cache>

    <cache name="org.hibernate.cache.internal.StandardQueryCache"
           maxElementsInMemory="500"
           eternal="false"
           timeToIdleSeconds="600"
           timeToLiveSeconds="3600"/>

    <cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
           maxElementsInMemory="50"
           eternal="true"/>
</ehcache>


Код: java
1.
2.
3.
 <dataset>
    <City id_city="1" name="Kiev" country="Ukraine"/>
</dataset>    



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@Entity
@Getter
@Setter
@Cacheable
@Cache(region = "referenceCache", usage = CacheConcurrencyStrategy.READ_WRITE)
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id_city")
    private Integer id;

    private String name;
    private String country;
}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@DatabaseSetup("/cache.xml")
public class EntityCacheTest extends BaseTest {

    @Test
    @Commit
    public void secondLevelCache() {
        City city = getSession().get(City.class, 1);
        Cache secondLevelCache = getSessionFactory().getCache();
        assertTrue(secondLevelCache.containsEntity(City.class, 1));
        city.setName("Kharkiv");
        //secondLevelCache.evictEntity(City.class, 1);
        getSession().flush();
        getSession().clear(); // clear first level cache
        City cachedCity = getSession().get(City.class, 1);
        System.out.println("");
    }



Вывод :

update
City
set
country='Ukraine',
name='Kharkiv'
where
id_city=1

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Hibernate:  
    insert 
    into
        CITY
        (ID_CITY, NAME, COUNTRY) 
    values
        (1, 'Kiev', 'Ukraine') 


Hibernate:  
    select
        city0_.id_city as id_city1_1_0_,
        city0_.country as country2_1_0_,
        city0_.name as name3_1_0_ 
    from
        City city0_ 
    where
        city0_.id_city=1 {elapsed: 75ms}
Hibernate:  add to batch  
    update
        City 
    set
        country='Ukraine',
        name='Kharkiv' 
    where
        id_city=1 {elapsed: 0ms}
Hibernate:  
    update
        City 
    set
        country='Ukraine',
        name='Kharkiv' 
    where
        id_city=1 {elapsed: 6ms}
Hibernate:  
    select
        city0_.id_city as id_city1_1_0_,
        city0_.country as country2_1_0_,
        city0_.name as name3_1_0_ 
    from
        City city0_ 
    where
        city0_.id_city=1 {elapsed: 0ms}

TRANSACTION BEFORECOMMIT!!!

TRANSACTION COMPLETE!!!
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268635
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1,

Чего там в pure JPA сказать не могу. В Spring можно добиться аналогичного эффекта через @Transactional(readOnly=true).

Вот я и в сомнениях ...

ибо такое впечатление что просто @Transactional(readOnly=true)

не работает ...

нужно как то так ... @Transactional(readOnly = true , propagation = Propagation.SUPPORTS)


+ еще можно обернуть все в unmodifiableList :)
Код: java
1.
2.
3.
4.
5.
   
 @Transactional(readOnly = true , propagation = Propagation.SUPPORTS)
    public List<Client> findAll() {
        return unmodifiableList(repository.findAll()); 
    }
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268654
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1ибо такое впечатление что просто @Transactional(readOnly=true)

Работает. Но как-то не до конца.
Я смотрю org.springframework.orm.jpa.vendor.HibernateJpaDialect
FlushMode этим атрибутом регулируется.
Но вот где он Session.setDefaultReadOnly() делает - я не вижу такого.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268671
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

В доке сказано что оптимизация имеется

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.repositories It’s definitely reasonable to use transactions for read only queries and we can mark them as such by setting the readOnly flag. This will not, however, act as check that you do not trigger a manipulating query (although some databases reject INSERT and UPDATE statements inside a read only transaction). The readOnly flag instead is propagated as hint to the underlying JDBC driver for performance optimizations. Furthermore, Spring will perform some optimizations on the underlying JPA provider. E.g. when used with Hibernate the flush mode is set to NEVER when you configure a transaction as readOnly which causes Hibernate to skip dirty checks (a noticeable improvement on large object trees).

Но у меня вместо NEVER получается MANUAL, а readonly прилетает через queryParameters
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268744
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892По поводу порядка запросов - а какая вам разница-то?

AFAIK При сложной структуре БД и кучу FK / constraints / triggers - может быть критично
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268748
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Flush
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268808
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЕще одна важная оптимизачия чтения в ORM это FlushMode. У меня как раз вчера коллеги в NHibernate с этим столкнулись, потому что Spring не используют.

В свое время Вы мне этим очень помогли !За что огромное спасибо :)

FlushMode это вообще какой-то волшебный атрибут у хибера :)
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268815
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1,

В доке сказано что оптимизация имеется

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.repositories It’s definitely reasonable to use transactions for read only queries and we can mark them as such by setting the readOnly flag. This will not, however, act as check that you do not trigger a manipulating query (although some databases reject INSERT and UPDATE statements inside a read only transaction). The readOnly flag instead is propagated as hint to the underlying JDBC driver for performance optimizations. Furthermore, Spring will perform some optimizations on the underlying JPA provider. E.g. when used with Hibernate the flush mode is set to NEVER when you configure a transaction as readOnly which causes Hibernate to skip dirty checks (a noticeable improvement on large object trees).

Но у меня вместо NEVER получается MANUAL, а readonly прилетает через queryParameters

тут вот так же есть описание поведения readOnly на JDBC
http://www.ibm.com/developerworks/ru/library/j-ts1/
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268835
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1тут вот так же есть описание поведения readOnly на JDBC
http://www.ibm.com/developerworks/ru/library/j-ts1/
Это уже зависит от драйвера и БД. Но Spring Data пытается и у конекшна этот флаг установить.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268874
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1тут вот так же есть описание поведения readOnly на JDBC
http://www.ibm.com/developerworks/ru/library/j-ts1/
сам сказал, что в ОРМ полно подводных камней.
А введением флага "только чтение" ты ещё добавил второй миллион багов и особенностей выполнения на разных БД.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39268876
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
это на тебя тот паттерн так повлиял?
Первый паттерн - "взял и работай". Ничего не трогая и не переключая.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269036
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Atum1,
это на тебя тот паттерн так повлиял?
Первый паттерн - "взял и работай". Ничего не трогая и не переключая.

@Transactional(readOnly=true) - Это простой спринговый аспект (ну хочется в это верить:) )

так что его код можно взять и посомтреть

https://github.com/spring-projects/spring-framework/blob/master/spring-tx/src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java

ну или какую то реализацию ...

грубо говоря это равносильно тому что мы метод обернули


в исполнение сами - мы же можем ввести свою транзакцию :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
   
      PlatformTransactionManager;
      DefaultTransactionDefinition;
      TransactionStatus;
....
 public void aopSqlCommand(){
      
try{
      begin(...);//  начали транзакцию 
        // вызвали метод  -> выполнили SQL 
      commit(...); // закочили
      
      } catch (DataAccessException e) {
         rollback(...);
         throw e;
      }
   
   }



но в декларативном стиле @Transactional(readOnly=true) - лучше смотрится ...
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269052
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Это простой спринговый аспект (ну хочется в это верить:) )
я не против.
Только что он сделает в моём примере с Ораклом?
Там нет читающих транзакций.
Коннект может делать что угодно если есть права в БД.
Поэтому я не понял всей этой бодяги.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269100
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1в исполнение сами - мы же можем ввести свою транзакцию :

Угу, только в ручной транзакции мы
- Не сказали коннекшну быть readOnly
- Не поменяли FlushMode, что скорее всего приведет к потере производительности
- Не сказали хибернейтовской сессии отключить dirty check proxy и snapshot-ы
- Никак не учитываем внешню транзакцию, если она уже открыта
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269105
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1в исполнение сами - мы же можем ввести свою транзакцию :

Угу, только в ручной транзакции мы
- Не сказали коннекшну быть readOnly
- Не поменяли FlushMode, что скорее всего приведет к потере производительности
- Не сказали хибернейтовской сессии отключить dirty check proxy и snapshot-ы
- Никак не учитываем внешню транзакцию, если она уже открыта

ну тут уже можно все эти параметры накрутить в виде атрибутов , что собственно в спринге и делается ?!

Petro123 ,
С Ораклом нужно смотреть как это реализовано у спринга и хибернейта .

Думаю есть какое то решение.

Через спринг и хибернейт я работаю с mysql .
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269106
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нифига transaction readonly не нужен. Дирти чек если только читать - его не будет, а то что будет выделять память для снэпшотов, да и фиг с ней. В джаве на памяти не заморачиваются.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269109
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Нифига transaction readonly не нужен. Дирти чек если только читать - его не будет, а то что будет выделять память для снэпшотов, да и фиг с ней. В джаве на памяти не заморачиваются.
Не мерял как там dirty check на производительность влияет, а вот смену FlushMode на производительности видно невооруженным глазом. Так что не надо трындеть. Читайте внимательнее что пишут. Иначе флаш после каждого запроса даст вашему серверу просраться как следует.
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269112
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1С Ораклом нужно смотреть как это реализовано у спринга и хибернейта .
Думаю есть какое то решение.
Через спринг и хибернейт я работаю с mysql .
нууууу. Это неинтересно)).
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269129
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczno56892Нифига transaction readonly не нужен. Дирти чек если только читать - его не будет, а то что будет выделять память для снэпшотов, да и фиг с ней. В джаве на памяти не заморачиваются.
Не мерял как там dirty check на производительность влияет, а вот смену FlushMode на производительности видно невооруженным глазом. Так что не надо трындеть. Читайте внимательнее что пишут. Иначе флаш после каждого запроса даст вашему серверу просраться как следует.
Причем здесь FlushMode и readonly?
...
Рейтинг: 0 / 0
JPA много @OneToOne
    #39269140
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Причем здесь FlushMode и readonly?
При тому что Spring умеет говорить JPA использовать FlushMode.MANUAL/NEVER когда стоит флаг readOnly.
В противном случае, если у вас будет одна сессия на кучу запросов, вы получите флаш на каждый заспрос с офигенным проседанием производительности.
...
Рейтинг: 0 / 0
25 сообщений из 79, страница 3 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA много @OneToOne
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]