2011-02-08 3 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 на каждой итерации. Когда я запускаю это против пустой таблицы 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: Если я создаю новый EntityManagerFactory внутри в то время цикла, он работает, но я понимаю, что, потому что я поставил DataCache и 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

+0

Вы пришли, чтобы решить эту проблему? Я столкнулся с той же проблемой :( – pgsandstrom

+1

@sandis см. Мой ответ – Joel

ответ

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