Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / jta (non-jta)-data-source / 9 сообщений из 9, страница 1 из 1
08.04.2013, 11:58:58
    #38216862
AndreyDmt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jta (non-jta)-data-source
Приветствую!
Были проблемы при закачке в БД (seam 2.2, jboss 5.1, oracle10) большого объема данных из xml: после 5-7 тысяч записей вываливалась ошибка (точно не помню уже какая), при этом даже те записи, которые по flush как бы должны были коммититься в базу, не сохранялись;
Поискал в инете - вроде как проблема в jta-data-source: обработчик события оборачивается в отдельную транзакцию, чтобы обеспечить целостность для события, и все внутренние flush становятся по барабану и по честному откатываются, если при работе обработчика происходила ошибка. Конкретно - кэш не справлялся с объёмом данных. Попробовал non-jta-data-source. И правда работает. Но есть некие проблемки.
1. Сделал в приложении два persistence-context: jta и non-jta. В обычной жизни пользую jta, для закачки данных - non-jta. При этом в начале и конце работы с non-jta вываливается предупреждение: Calling joinTransaction() on a non JTA EntityManager. Вроде сильно не тревожит, но оно на экран валится, юзеров пугает. Неприятно. Не подскажете, как то можно побороть?
2. Хотел создавать non-jta только перед использованием (в components.xml поставить auto-create="false"). Не проканало. Создаваться то оно создаётся по запросу, но не видит entity-классы. Пишет что то типа: "класс не найден или не существует". Опять же, можно как то победить или не стОит заморачиваться?
...
Рейтинг: 0 / 0
08.04.2013, 12:09:38
    #38216883
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jta (non-jta)-data-source
А использовать UserTransaction и комитить в процессе переодически?
...
Рейтинг: 0 / 0
08.04.2013, 15:23:22
    #38217375
AndreyDmt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jta (non-jta)-data-source
BlazkowiczА использовать UserTransaction и комитить в процессе переодически?
Для jta - чёт не задалось. В смысле, пробовал - не помогло. Точно уже не помню, с год назад бился, тогда надо было быстро - не получилось, бросил. Ну раз прозвучало - попробую ещё раз.
Для non-jta - я так практически и делаю: em.getTransaction().begin() - commit();
...
Рейтинг: 0 / 0
08.04.2013, 15:23:25
    #38217376
bourne
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jta (non-jta)-data-source
AndreyDmt,

JDKvoid flush()
Synchronize the persistence context to the underlying database.

Что означает только одно: при вызове этого метода происходит синхронизация состояния объектов в памяти с данными из БД.
Коммит (т.е физическое изменение данных в БД, на жестком диске, если хотите) произойдет при успешном завершении транзакции. Автоматически, если используется JTA или в ручную tx.commit();
В вашем случае этого не происходит.

Для таких задач как ваша в большинстве JPA провайдеров и JDBC драйверов существует поддержка пакетной обработки.
Например, http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html
...
Рейтинг: 0 / 0
09.04.2013, 09:08:54
    #38218174
AndreyDmt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jta (non-jta)-data-source
bourne,

Но это то и так понятно. Я наверное проблему не правильно описАл. У меня в бине, обслуживающем визуальную форму одновременно существует два ентити менеджера. Один jta (скажем em-select) и второй non-jta (em-update). Первый вообще отнаследовался, я его убрать не могу, да и нужен он мне для рутины, тоже отнаследованной. Второй чисто для записи данных из файла внедрён через @In конкретно в эту форму. Его и пользую через beginTransaction(), commit(). Никаких flush() в этом случае для сохранения не пользую - это не работает. Через begin-commit успешно перевалил через поллимона записей в один проход. Поэтому грех жаловаться. Проблемы:
1. Почему при запуске и окончании работы листенера (нажимаю кнопку - выскакивает в логах, заканчивает работу - второй раз выскакивает) идёт попытка на вызов joinTransaction именно к non-jta? Их же два. Выбирается почему то именно non-jta (или сразу оба?). Как разубедить, убрать варнинг? Просто не понимаю что происходит, потому переживаю.
2. В какой момент, созданный ентити-менеджер получает информацию (хм... О чём? Среде выполнения?) Почему создавая его в самом бине, я не моду достучаться до ентити классов. Мне он нужен то в одном обработчике, и то не каждый раз. Тут может даже хватит ответа: всё работает, дерзай дальше. Чтобы понимать, стОит дальше ковырять или бросить.
...
Рейтинг: 0 / 0
09.04.2013, 14:43:17
    #38218861
bourne
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jta (non-jta)-data-source
AndreyDmt,
давайте код ваш посмотрим
...
Рейтинг: 0 / 0
10.04.2013, 07:49:09
    #38219684
AndreyDmt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jta (non-jta)-data-source
bourne, Ну давайте

Это -ds.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
	<local-tx-datasource>
		<jndi-name>selDatasource</jndi-name>
		<use-java-context>true</use-java-context>
		<connection-url>jdbc:oracle:thin:@srv:1521:oradb</connection-url>
		<driver-class>oracle.jdbc.OracleDriver</driver-class>
		<user-name>USER</user-name>
		<password>12345</password>
	</local-tx-datasource>

	<no-tx-datasource>
		<jndi-name>updDatasource</jndi-name>
		<use-java-context>true</use-java-context>
		<connection-url>jdbc:oracle:thin:@srv:1521:oradb</connection-url>
		<driver-class>oracle.jdbc.OracleDriver</driver-class>
		<user-name>USER</user-name>
		<password>12345</password>
	</no-tx-datasource>


Это выдержка из components.xml. Здесь пытался поставить auto-create="false" для второго ем
Код: xml
1.
2.
3.
4.
	<persistence:managed-persistence-context name="entityManager"
		auto-create="true" persistence-unit-jndi-name="java:/selEntityManagerFactory" />
	<persistence:managed-persistence-context name="entityManagerUpd"
		auto-create="true" persistence-unit-jndi-name="java:/updEntityManagerFactory" />


Это кусок бина
Код: 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.
@Name("updateBean")
@Scope(ScopeType.CONVERSATION)
public class LoadUpdateBean extends CommonFormBean {

	// Это в родительском классе 
	//@In
	//EntityManager entityManager;
	
	@In //(create = true) - это я пытался создать ем для случая auto-create="false"
	EntityManager entityManagerUpd;
	
	// Вот здесь кнопку жмём
	public void testFileDataListener(ActionEvent event) {
		// Во тут  уже первый варнинг выскочил. Перед или сразу после вызова листенера
		//...
                // Запускаем обработку xml
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		testparser = new XmlDataParcer();
		// В парсер передали менеджер, созданный для обновления
		testparser.setEntityManager(entityManagerUpd);
		//...
		// Вот тут второй варнинг. Опять же в конце или сразу после обработчика
	}
}



Это сам парсер
Код: 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.
48.
49.
50.
51.
public final class XmlDataParcer extends DefaultHandler {

	// Переданный в парсер ем
	private EntityManager entityManager;

	// Это вход в структуру xml	
	private boolean parceLevel1(String qName, Attributes atts) throws SAXException {
		// ...
		if (!entityManager.getTransaction().isActive()) {
			entityManager.getTransaction().begin();
		}
		//...
	}
	
	// Это парсинг объекта
	private void parceLevel2(String qname, Attributes atts) throws SAXException {
		//...
		// Если нужно - записываем. Функция в классе, описывающем объект
		int res = this.xmlParceObject.saveData(entityManager, this.testOnly);
		//...
	}
	
	// Это завершение парсинга
	public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
          //...
		switch (this.level) {
		case 1:
                         //...
			// Уровень документа. Завершаем парсинг файла
			if (getEntityManager().getTransaction().isActive()) {
				getEntityManager().getTransaction().commit();
			}
			break;
		case 2:
			// Уровень объекта. Каждую 1000 делаем коммит
                        //...
			this.objectCount++;
			if ((this.objectCount % 1000) == 0) {
				if (getEntityManager().getTransaction().isActive() && (this.objectNotSaved > 0)) {
					this.getEntityManager().getTransaction().commit();
					this.objectNotSaved = 0;
					this.getEntityManager().getTransaction().begin();
				}
			}
			break;
		default:
			break;
		}
	 //...      
	}
}


Собственно вот это я пытался на словах объяснить.
...
Рейтинг: 0 / 0
10.04.2013, 07:55:48
    #38219685
AndreyDmt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jta (non-jta)-data-source
Забыл всё таки...
persistence.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.
	<persistence-unit name="cbws">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:/selDatasource</jta-data-source>

		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
			<property name="hibernate.hbm2ddl.auto" value="validate" />
			<property name="hibernate.show_sql" value="false" />
			<property name="hibernate.format_sql" value="false" />
			<property name="jboss.entity.manager.factory.jndi.name" value="java:/selEntityManagerFactory" />
		</properties>
	</persistence-unit>

	<persistence-unit name="cbwsupd" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<non-jta-data-source>java:/updDatasource</non-jta-data-source>

		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
			<property name="hibernate.hbm2ddl.auto" value="validate" />
			<property name="hibernate.show_sql" value="false" />
			<property name="hibernate.format_sql" value="false" />
			<property name="jboss.entity.manager.factory.jndi.name" value="java:/updEntityManagerFactory" />
		</properties>
	</persistence-unit>
...
Рейтинг: 0 / 0
11.04.2013, 11:24:03
    #38221462
bourne
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
jta (non-jta)-data-source
AndreyDmt,

предлагаю попробовать указать значение persistence-unit в аннотации для EntityManager'а.

С seam не работал, а в JPA так:

@PersistenceContext(unitName="cbws")
EntityManager entityManager;
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / jta (non-jta)-data-source / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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