2011-02-08 77 views
3

我無法在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

回答

0

我通過回覆到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"/>