我有一个带有gui的应用程序和一个保存在db中的股票列表。我在应用程序运行的整个过程中使用1个EntityManager来删除,更改和添加新股票。我有一个线程,定期抓住股票的实际股票过程并将其保存在数据库中。我在线程中使用另一个实体管理器(导致线程安全)。
这意味着对于我对股票进行的每项操作(如删除,更改,查看股票课程),我必须先调用合并,因为主要实体经理不知道对方已添加的股票课程。现在的问题是,如果程序运行了很长时间并且用户从未对库存做过任何事情,那么将会有数千个新课程需要先合并,因此需要很长时间(> 10秒) 。我该怎么办?或者我做错了还有更好的方法吗?
编辑:这基本上就是我在线程中每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);
stockPriceModel中的saveActualStockPrice:
transaction.commit();
transaction.begin();
em.persist(actualStockPrice);
因为我在我的线程中使用了不同的实体管理器然后在我的应用程序的其余部分中我现在有数据(即线程保存在数据库中的所有stockPrices)在我的数据库中我的主要部分不知道我必须调用合并()在我对数据做任何事情之前。如果我不这样做,我的em会在我提交()时再尝试插入新的StockPrices。现在的问题是,如果我长时间没有做出任何事情,将会有如此多的独立股票价格(比如几千),合并()将持续一段时间。现在我不知道该怎么做。
答案 0 :(得分:0)
我不得不猜测你想要什么,但我会尝试。我遇到的一个问题是我不知道什么是“股票套餐”;我假设它是关于股票的一些信息集合。
如果我正确地读了你,你会得到一些关于一组股票的信息,你经常会去获取更新的信息。出于某种原因,在用户执行某些操作之前,您不会更新原始库存信息。我猜这是你的问题所在。
我建议您在获得新信息后立即使用新信息更新原始信息集。这应该可以通过同步更新信息的对象上的线程来实现。例如,仅作为示例,如果您有一个表示一个库存的所有信息的类,并且它具有将当前值保存到数据库的方法,则可以同步对这些方法的访问,以确保没有两个线程尝试更新信息同时存在,从而避免了两种方法交叉更新信息的任何问题。
我很惊讶你的用户界面没有在你做的时候得到更新;也许它确实如此,但你的数据库没有。正如我所说,很难从你当前的描述中准确理解你正在使用该程序做什么。