2012-03-06 7 views
0

У меня есть приложение с gui и список акций, которые сохраняются в db. Я использую 1 EntityManager все время, когда приложение работает, для удаления, изменения и добавления новых акций. У меня есть поток, который периодически захватывает фактические курсы акций запасов и сохраняет их в дБ. Я использую другой менеджер сущности в потоке (причина безопасности потока).Слияние() в многопоточном приложении JPA

Это означает, что для каждой операции, которую я делаю на складе (например, удаление, изменение, просмотр курсов акций), мне нужно сначала вызвать merge, потому что главный менеджер объекта не знает курсы акций, добавленные другим. Проблема заключается в том, что если программа работает долгое время, и пользователь никогда ничего не сделал с запасом, будут тысячи новых курсов, которые должны сначала объединиться, что займет очень много времени (> 10 секунд). Что я могу сделать по этому поводу? Или я делаю это неправильно, и есть лучший способ?

Edit: Это в основном то, что я делаю каждые 5 минут в моей теме:

// grabbing the actual stockprice and making actualStockPrice with it 
.... 
    // adding the correct stock to the new stockprice 
actualStockPrice.setStock(stock); 
    // adding stockprice to stock 
stock.getActualStockPrices().add(actualStockPrice); 
    // Saving new price to db (stockPriceModel has it's own em) 
stockPriceModel.saveActualStockPrice(actualStockPrice); 

saveActualStockPrice в stockPriceModel:

transaction.commit(); 
transaction.begin(); 
em.persist(actualStockPrice); 

Причина я использую другую EntityManager в моем потоке, то в остальной части мое приложение у меня теперь есть данные (а именно все фондовыецены, которые поток, сохраненный в db) в моем db, мой главный em не знает, что мне нужно вызвать merge(), прежде чем я что-нибудь сделаю с данными. Если я не сделаю этого, мой em попытается снова вставить новые StockPrices, как только я зафиксирую() что-то с ним. Проблема в том, что если я не буду что-то совершать в течение долгого времени, будет так много отброшенных запасов (скажем, несколько тысяч), что слияние() займет целую вечность. И теперь я понятия не имею, что делать.

+0

Пожалуйста, отправьте примеры кода, чтобы проиллюстрировать вашу модель сущности, вместе с которой оператор является медленным, и некоторые примеры SQL-запросов, которые приводят к результату – wrschneider

ответ

0

Мне нужно угадать, что вы хотите, но я попробую. Одна из проблем заключается в том, что я не знаю, что такое «курс акций»; Я предполагаю, что это некоторая коллекция информации о запасе.

Если я правильно прочитал, у вас есть своя информация о наборе акций, и каждый раз часто вы отправляетесь и получаете обновленную информацию. По какой-то причине вы не обновляете информацию о запасах, которую вы изначально использовали, пока пользователь ничего не сделает. Я предполагаю, что это ваша проблема.

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

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

+0

. Фондовые котировки - это фондовые цены. Sry я использовал 2 слова для одного и того же:/В принципе, gui - это список акций (имя и т. д.), и каждый запас в списке обновляется каждые 5 минут с недавно захваченной Фондовой ценой. Мой код в моем первом сообщении делает это (он добавляет недавно захваченную цену акций к соответствующему фонду и соответствующему акциям к новому объекту цены акций, а затем сохраняет новую цену акций в db). Моя проблема в том, что у меня есть 2 менеджера сущностей. –

+0

Тот, что в потоке, который пишет фактические цены акций в таблице, а другой, который делает все остальное в приложении.Когда я теперь совершаю что-либо с моим основным em, он пытается также сохранить новый товарный знак в db, потому что новые модели находятся в модели, но мои основные em думают, что они не находятся в db, потому что он никогда их не совершал. Вот почему я должен использовать слияние перед фиксацией, чтобы получить новые фондовые индексы и не пытаться добавить их снова. Но если пользователь в течение долгого времени ничего не делает, будет много новых ценных бумаг, и, таким образом, следующая фиксация (слияние) займет «навсегда». –

+0

Прошу прощения, но я не могу понять, что вы пытаетесь сказать. «пишет фактические цены акций в таблице» - таблица db или JTable? или какой-нибудь другой стол? «делает все остальное» - что? «Главное em» - что это такое? «потому что он никогда их не совершал» - кто он? почему нет? «... чтобы он получил», - кто он? «будет много новых цен на акции», где? у вас есть поток, который записывает их в модель и базу данных, где они складываются? Почему у вас есть два менеджера сущностей? Я думаю, что пришло время сделать три шага назад и описать, что вы пытаетесь сделать на высоком уровне. Отделите это – arcy

Смежные вопросы