powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Data JPA, мультипоточность
14 сообщений из 14, страница 1 из 1
Spring Data JPA, мультипоточность
    #38636348
publexus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложение на 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
Spring Data JPA, мультипоточность
    #38636416
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
publexus1. Как настроить, чтобы каждый поток работал с отдельным коннектом?

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

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

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

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

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

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

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


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

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

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

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

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


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