Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Data JPA, мультипоточность / 14 сообщений из 14, страница 1 из 1
08.05.2014, 10:53
    #38636348
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
Приложение на Spring Data JPA.

Конфигурационных файл app-context.xml
Код: xml
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.
	<bean id="myAppDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
		<property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
		...
	</bean>

	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="myAppDataSource" /> 
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
		</property>
		<property name="packagesToScan" value="myapp.data.domain" />
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
				<prop key="hibernate.max_fetch_depth">3</prop>
				<prop key="hibernate.jdbc.fetch_size">50</prop>
				<prop key="hibernate.jdbc.batch_size">10</prop>
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
		<property name="jpaDialect">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
		</property>
	</bean>

	<tx:annotation-driven transaction-manager="transactionManager" />

	<context:annotation-config />
	<context:component-scan base-package="myapp.data.dao" />

	<jpa:repositories base-package="myapp.data.repository"
			entity-manager-factory-ref="entityManagerFactory"
			transaction-manager-ref="transactionManager" />


пример типовой сущности, репозитория и DAO
Код: 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.
@Entity
@NamedQuery(name="Obj.findAll", query="SELECT o FROM Obj o")
public class Obj implements Serializable {
...
}

---------------------------------------------------------------
@Service("objRepository")
public interface ObjRepository extends CrudRepository<Obj, Long> {

}

---------------------------------------------------------------
@Repository("objDAO")
@Transactional
public class ObjDAO {

	@Autowired
	private ObjRepository repository;

	@Transactional(readOnly=true)
	public List<Obj> findAll() { return Lists.newArrayList(repository.findAll()); }

	public Obj save(Obj obj) { return repository.save(obj); }

	public void delete(Obj obj) { repository.delete(obj); }
}



На данный момент все операции save, насколько я понял, выполняются отдельными транзакциями.
В приложении запускаются несколько потоков с интенсивной обработкой данных, но несмотря на то, что сконфигурирован пул соединений (BoneCP) по трассировке БД видно, что все потоки используют только одно соединение.

1. Как настроить, чтобы каждый поток работал с отдельным коннектом?
2. Как правильно задать границы транзакции, если мне надо, чтобы в определенном месте кода при работе с сущностями началась транзакция и в определенном месте она заканчивалась?
3. Как при выполнении уже существующей транзакции независимо выполнить другую транзакцию - например записать строку в таблицу лога, при этом фиксация (или откат) во второй транзакции никак не должна влиять на основную транзакции?
...
Рейтинг: 0 / 0
08.05.2014, 11:20
    #38636416
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
publexus1. Как настроить, чтобы каждый поток работал с отдельным коннектом?

А оно надо? Зачем тогда пул?

publexus2. Как правильно задать границы транзакции, если мне надо, чтобы в определенном месте кода при работе с сущностями началась транзакция и в определенном месте она заканчивалась?

Использовать @Transactional на уровне сервиса.

publexus3. Как при выполнении уже существующей транзакции независимо выполнить другую транзакцию - например записать строку в таблицу лога, при этом фиксация (или откат) во второй транзакции никак не должна влиять на основную транзакции?
Google -> Spring Declarative Transaction Propagation
...
Рейтинг: 0 / 0
08.05.2014, 11:47
    #38636490
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
Blazkowiczpublexus1. Как настроить, чтобы каждый поток работал с отдельным коннектом?

А оно надо? Зачем тогда пул?Т.к. по сути - это сервис, обрабатывающий запросы, и обработка может включать длинные транзакции, поэтому надо обеспечить параллельную работу. Но, возможно, это достигается правильной настройкой 2-го пункта.

Blazkowiczpublexus2. Как правильно задать границы транзакции, если мне надо, чтобы в определенном месте кода при работе с сущностями началась транзакция и в определенном месте она заканчивалась?

Использовать @Transactional на уровне сервиса.Добавлял я @Transactional к примеру для метода MyClass.processData, но в результате, все операции с сущностями внутри этого метода все равно выполнялись отдельными фиксациями.
...
Рейтинг: 0 / 0
08.05.2014, 11:57
    #38636515
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
publexusТ.к. по сути - это сервис, обрабатывающий запросы, и обработка может включать длинные транзакции, поэтому надо обеспечить параллельную работу. Но, возможно, это достигается правильной настройкой 2-го пункта.
Длинные транзакции и многопоточность это какое-то стремное сочетание. Нужно ещё чтобы и база справилась.


publexusИспользовать @Transactional на уровне сервиса.Добавлял я @Transactional к примеру для метода MyClass.processData, но в результате, все операции с сущностями внутри этого метода все равно выполнялись отдельными фиксациями.[/quot]
фиксациями? Надо подебажить. Почитать логи. Проверить смог ли Spring завернуть MyClass в прокси, чтобы перехватывать вызов к processData и запускать транзакцию. Может у вас processData вызывается из того же класса? Может MyClass создаётся без IoC?

Не знаю как там точно на аннотациях и в последниех версиях, но на XML раньше надо было явно оборачивать сервисы через TransactionProxyFactoryBean. Думаю, сейчас уже спринг сам это делает.
...
Рейтинг: 0 / 0
08.05.2014, 12:09
    #38636545
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
BlazkowiczДлинные транзакции и многопоточность это какое-то стремное сочетание. Нужно ещё чтобы и база справилась.
Почему же стремно? Если архитектура и структура позволяет выполнять определенные транзакции, практически без риска блокировок других сессий, почему бы им и не быть столь длинными, сколь этого требует логика.
...
Рейтинг: 0 / 0
08.05.2014, 12:16
    #38636557
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
publexusПочему же стремно? Если архитектура и структура позволяет выполнять определенные транзакции, практически без риска блокировок других сессий, почему бы им и не быть столь длинными, сколь этого требует логика.
Вы об этом лучше у DBA поспрашивайте. Если у вас можно изолировать транзакции так чтобы они друг-другу не мешали, то вам и транзакции тогда особо не нужны.
...
Рейтинг: 0 / 0
08.05.2014, 12:52
    #38636646
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
BlazkowiczЕсли у вас можно изолировать транзакции так чтобы они друг-другу не мешали, то вам и транзакции тогда особо не нужны.
Почему же, транзакции нужны не только для эксклюзивности, но и для атомарности.
Например, если нужно, чтобы в базу был загружен пакет данных, причем обязательно либо полностью, либо не загружен вовсе, и при этом нет необходимости блокировать разделяемые данные. Это как раз такой случай, когда транзакция необходима, и при этом может быть сколь угодно долгой без ущерба для остальных процессов.
...
Рейтинг: 0 / 0
08.05.2014, 13:02
    #38636676
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
publexusПочему же, транзакции нужны не только для эксклюзивности, но и для атомарности.
Например, если нужно, чтобы в базу был загружен пакет данных, причем обязательно либо полностью, либо не загружен вовсе, и при этом нет необходимости блокировать разделяемые данные. Это как раз такой случай, когда транзакция необходима, и при этом может быть сколь угодно долгой без ущерба для остальных процессов.
Для этого, зачастую, достаточно кэша первого уровня ORM, которые все изменения в транзакции накапливает в Session/EntityManager и только при комите\флаше сбрасывает их в базу. Таким образом можно сократить длину транзакции в БД.
...
Рейтинг: 0 / 0
08.05.2014, 13:48
    #38636767
Iliyam
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
Судя по вашим словам, вам не требуется блокировать что-то в БД в начале вашей "длинной" транзакции. Тогда почему не оставить всю "длинность" на уровне сервиса, а в БД писать, когда уже все будет "на руках"? А атомарность, изолированные транзакции и т.п. на уровне БД, реализовать через хранимую процедуру.
...
Рейтинг: 0 / 0
08.05.2014, 14:26
    #38636828
publexus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
Iliyam,

Можно и так сделать, хранить все данные в памяти, и затем сбрасывать их в базу единовременно.
Но если данных будет много, да еще и несколько потоков, хватит ли на все памяти?
...
Рейтинг: 0 / 0
08.05.2014, 14:27
    #38636830
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
publexusМожно и так сделать, хранить все данные в памяти, и затем сбрасывать их в базу единовременно.
Но если данных будет много, да еще и несколько потоков, хватит ли на все памяти?
А если всё хранить в логе транзакций, хватит ли на всё IO диска?
...
Рейтинг: 0 / 0
08.05.2014, 15:48
    #38636962
Iliyam
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
publexus,

а вы считаете открытый коннект к БД памяти не требует? Плюс доп расходы в виде записи в логи, как сказал Blazkowicz, и т.п.
В любом случае расходы будут. Проблема в том, что реализовать те хотелки, что вы перечислили, используя ORM довольно проблематично. Да в общем и несильно надо, т.к. критичен момент записи в БД, а это можно гарантировать через хранимки в самой БД.
...
Рейтинг: 0 / 0
08.05.2014, 15:52
    #38636968
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
не понял проблему.
- надо указать пулу МАКС_КОННЕКТОВ = 100 и работать
- либо делать пул потоков и на каждый поток - соединение, но пул убрать.
...
Рейтинг: 0 / 0
08.05.2014, 16:11
    #38637002
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Data JPA, мультипоточность
publexusIliyam,

Можно и так сделать, хранить все данные в памяти, и затем сбрасывать их в базу единовременно.
Но если данных будет много, да еще и несколько потоков, хватит ли на все памяти?
монопсуально
- в БД выделяется память под откат транзакции админом - нет проблем
- на АппСервере аналогично.
Если у вас не изврат, то программист о памяти не заботится )) (с)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Data JPA, мультипоточность / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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