java - 如何在 OpenJPA 2.0.1 中禁用缓存(编辑 : Issues with BoneCP)

标签 java jpa jpa-2.0 openjpa bonecp

我无法在 OpenJPA 2.0.1 中禁用缓存。

我在我的persistence.xml 中设置了以下属性:

<property name="openjpa.DataCache" value="false"/>
<property name="openjpa.QueryCache" value="false"/>
<property name="openjpa.jdbc.QuerySQLCache" value="false"/> <!-- I don't believe this is  necessary -->

当我启动我的应用程序时,我可以看到这些属性的正确值已注销。

我已经创建了一个基本实体来测试它,它有一个每秒简单地查询表的主要方法。我在每次迭代中创建一个新的 EntityManager。当我针对一个空的 TEST 表运行它,然后手动将数据插入测试时:

insert into TEST values (1,'a');

它永远不会获取新数据(尽管如果我重新启动程序它会获取)。

import java.util.List;    
import javax.persistence.*;

@Entity
@Access(AccessType.PROPERTY)
@Table(name="TEST")
public class Test {

    private int id;
    private String name;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="ID")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    @Column(name="NAME")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    // SIMPLE TEST CASE
    public static void main(String[] args) throws Exception {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("su3", null);
        while(true) {
            EntityManager em = factory.createEntityManager();
            TypedQuery<Test> q = em.createQuery("select t from Test t", Test.class);
            List<Test> res = q.getResultList();
            for (Test t :res) {
                System.out.println(t.getId()+", " + t.getName());
            }
            Thread.sleep(1000);
            em.close();
        }
    }
}

我做错了什么?

EDIT1:如果我在 while 循环 创建一个新的 EntityManagerFactory,它会起作用,但我的理解是,因为我已将 DataCache 和 QueryCache 设置为 false,所以我不这样做需要这样做,而且这样做的成本很高。

EDIT2:我正在使用 BoneCP作为我的连接池管理器,当我恢复使用 DHCP 或 C3P0 时,问题就消失了。不知道为什么...

EDIT3:这是我用于 BoneCP 的配置:

<property name="openjpa.ConnectionDriverName" value="com.jolbox.bonecp.BoneCPDataSource"/>
<property name="openjpa.ConnectionProperties" value="DriverClassName=com.mysql.jdbc.Driver,jdbcUrl=jdbc:mysql://localhost:3306/mydb,Username=xxxx,Password=yyyy,partitionCount=3"/>

最佳答案

我通过使用以下配置恢复到 c3p0 驱动程序解决了我的问题:

<property name="openjpa.ConnectionDriverName"  value="com.mchange.v2.c3p0.ComboPooledDataSource"/>
<property name="openjpa.ConnectionProperties" value="DriverClassName=com.mysql.jdbc.Driver,jdbcUrl=jdbc:mysql://localhost:3306/dbname,characterEncoding=UTF8,useUnicode=true,user=username,password=password,autocommit=false,automaticTestTable=testtable,idleConnectionTestPeriod=60"/>
<property name="openjpa.DataCache" value="false"/>

关于java - 如何在 OpenJPA 2.0.1 中禁用缓存(编辑 : Issues with BoneCP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4932986/

相关文章:

java - emptyList() vs empty Set(),如果需要 Collection 的实例,是否有任何理由选择一个而不是另一个?

java - 如何将自定义对象 ID 注入(inject) JPA 实体

java - 许多嵌入式属性引用相同的 Embeddable 类

hibernate - JPA 条件查询,上课顺序

java - hibernate 。多对多。双向关联。楼主是什么意思?

java - 在哪里可以找到 jpa orm.xml 使用示例

java - 检查 ArrayList 中的子字符串

java - Android - 从 url 获取图像作为 JSON 并在图库 View 中显示它们

java - ArrayList 与 jList 的自定义类

java - 如何在不使用注释的情况下在 JavaEE 6 中获取容器管理的实体管理器