gpt4 book ai didi

java - jpa 遇到问题,当被告知忽略时看起来正在从缓存中读取

转载 作者:行者123 更新时间:2023-12-01 16:04:28 25 4
gpt4 key购买 nike

我正在使用 jpa 和 eclipselink。它说 eclipselink 版本为 2.0.2.v20100323-r6872。这是一个 SE 应用程序,很小。本地持久化单元。我正在使用 postgres 数据库。我有一些代码每秒唤醒一次并对表执行 jpa 查询。它正在轮询以查看给定记录上的某些字段是否发生更改。但是当我更新 sql 中的字段时,每次查询它时它都会显示相同的值。这是在等待之后,创建一个新的实体管理器,并给出查询提示。当我从 sql 或 python 查询表时,我可以看到更改的字段。但是从我的 jpa 查询中,一旦我读取了该值,它在以后的查询执行中就不会改变——即使实体管理器已被重新创建。我试过告诉它不要在缓存中查找。但它似乎忽略了这一点。很困惑,请问可以帮忙吗?

方法如下。我每 3 秒调用一次。 tgt.getTrlDlrs() println 显示我在每次调用该方法时都会获得该字段的相同值(“值不会改变”)。即使我更改数据库中的字段。当我从java外部查询记录时,我立即看到变化。另外,如果我停止 java 程序并重新启动它,我会立即看到打印出的新值:

public void exitChk(EntityManagerFactory emf, Main_1 mn){
// this will be a list of the trade close targets that are active
List<Pairs01Tradeclosetgt> mn_res = new ArrayList<Pairs01Tradeclosetgt>();

//this is a list of the place number in the array list above
//of positions to close
ArrayList<Integer> idxsToCl = new ArrayList<Integer>();

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.clear();
String qryTxt =
"SELECT p FROM Pairs01Tradeclosetgt p WHERE p.isClosed = :isClosed AND p.isFilled = :isFilled";
Query qMn = em.createQuery(qryTxt);
qMn.setHint(QueryHints.CACHE_USAGE, CacheUsage.DoNotCheckCache);
qMn.setParameter("isClosed", false);
qMn.setParameter("isFilled", true);
mn_res = (List<Pairs01Tradeclosetgt>) qMn.getResultList();

// are there any trade close targets we need to check for closing?
if (mn_res!=null){
//if yes, see whether they've hit their target
for (int i=0;i<mn_res.size();i++){
Pairs01Tradeclosetgt tgt = new Pairs01Tradeclosetgt();
tgt = mn_res.get(i);
System.out.println("value won't change:" + tgt.getTrlDlrs());

这是我的实体类(部分):

@Entity
@Table(name = "pairs01_tradeclosetgt", catalog = "blah", schema = "public")
@NamedQueries({
@NamedQuery(name = "Pairs01Tradeclosetgt.findAll", query = "SELECT p FROM Pairs01Tradeclosetgt p"),
@NamedQuery(name = "Pairs01Tradeclosetgt.findByClseRatio", query = "SELECT p FROM Pairs01Tradeclosetgt p WHERE p.clseRatio = :clseRatio")})
public class Pairs01Tradeclosetgt implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "id")
@SequenceGenerator(name="pairs01_tradeclosetgt_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "pairs01_tradeclosetgt_id_seq")
private Integer id;

和我的坚持单位:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="testpu" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>mourv02.Pairs01Quotes</class>
<class>mourv02.Pairs01Pair</class>
<class>mourv02.Pairs01Trderrs</class>
<class>mourv02.Pairs01Tradereq</class>
<class>mourv02.Pairs01Tradeclosetgt</class>
<class>mourv02.Pairs01Orderstatus</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://192.168.1.80:5432/blah"/>
<property name="javax.persistence.jdbc.password" value="secret"/>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.user" value="noone"/>
</properties>
</persistence-unit>
</persistence>

最佳答案

对于稍后查看此内容的人,在表注释下添加此内容是一种解决方法:@Cache(类型=CacheType.NONE)

但是这样的话当然就没有缓存了。但至少我的值(value)刷新了。似乎 Eclipse 链接不听提示,因为我在上面的示例中编写了它。

关于java - jpa 遇到问题,当被告知忽略时看起来正在从缓存中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2923907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com