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"/>
將partitionCount = 3等添加到連接字符串是沒有意義的。該行由驅動程序解析,而不是池。 – wwadge 2011-05-04 09:56:20