如何在OpenJPA 2.0.1中禁用缓存(编辑:BoneCP问题)

问题描述:

我无法在OpenJPA 2.0.1中禁用缓存。如何在OpenJPA 2.0.1中禁用缓存(编辑:BoneCP问题)

我在的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。当我跑这对一个空的测试表,并随后手动将数据插入测试:

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:如果我创建一个新的EntityManagerFactory while循环,它的工作原理,但我的理解是,因为我已经把数据高速缓存,并实现QueryCache假我不需要做到这一点,以及它这样做很昂贵。

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"/> 
+0

将partitionCount = 3等添加到连接字符串是没有意义的。该行由驱动程序解析,而不是池。 – wwadge 2011-05-04 09:56:20

我通过回复到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"/>