JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Application Server » Tomcat  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 Geronimo 中的 war 檔,會共同使用一個 JPA 的 persistence.xml 嗎?
wureka





發文: 37
積分: 0
於 2009-07-27 14:23 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問,我再 Geronimo 2.1.4 中,放了兩個war 檔。
假設叫做 war1, war2
兩個 war 檔。都有使用 OpenJPA 1.2 (Geronimo 內建的)
war1 的 persistence.xml 中有定義 entity A1.class, persistence-unit name="w1"
war2 的 persistence.xml 中有定義 entity B1.class, persistence-unit name="w2"

問題1. Geronimo 會把兩個 war 檔中的 persistence.xml 看成同一個嗎?
我舉個例子。假設 在某時間點 t, 我們在 Geronimo Console 中把 war1 啟用(running),所以 Geronimo 認定目前的 persistence.xml 有定義 A1.class. 而在時間點 t+2 時, 我們在 Geronimo Console 把war2 啟用(running),則 Geronimo 認定目前的 persistence.xml 中僅有定義 A1.class (沒有 B1.class)。
此時,當 war2 中有程式被呼叫啟用時,會出現兩個錯誤:
1. Persistence.createEntityManagerFactory("w2") 會造成 NullPointerException。因為 Geronimo 的 persistence.xml 只會有一份,Geronimo 似乎只認定第一份
2. 有時僥倖(1)不會發生,卻會發生 B1.class 找不到

不知有沒有人可以告知解決方式?
基本上,我認為設定檔都沒問題,因為每個 war 檔單獨跑的時候,都正常。但是一旦兩個 war 都跑起來之後。後跑的那個 war 就會出現這類的錯誤。

war1 的 persistence.xml 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="w1" transaction-type="RESOURCE_LOCAL">
    <provider>
      org.apache.openjpa.persistence.PersistenceProviderImpl
    </provider>
 
    <class>A1</class>
    
    
    <properties>
      略
    </properties>
  </persistence-unit>
</persistence>
 


war2 的 persistence.xml 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="w2" transaction-type="RESOURCE_LOCAL">
    <provider>
      org.apache.openjpa.persistence.PersistenceProviderImpl
    </provider>
 
    <class>B1</class>
    
    
    <properties>
      略
    </properties>
  </persistence-unit>
</persistence>
 


以下是我的 EntityManger的處理方式,那是取自 MyEclipse 裡的產生方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class EntityManagerHelper {
  
  private static final EntityManagerFactory emf; 
  private static final ThreadLocal<EntityManager> threadLocal;
  private static final Logger logger;
  
  static {
    emf = Persistence.createEntityManagerFactory("w2"); <----w2 會死在這行, NullPointerException
    threadLocal = new ThreadLocal<EntityManager>();
    logger = Logger.getLogger("zoo.bee");
    logger.setLevel(Level.ALL);
  }
    
  public static EntityManager getEntityManager() {
    EntityManager manager = threadLocal.get();    
    if (manager == null || !manager.isOpen()) {
      manager = emf.createEntityManager();
      threadLocal.set(manager);
    }
    return manager;
  }
  
   public static void closeEntityManager() {
        EntityManager em = threadLocal.get();
        threadLocal.set(null);
        if (em != null) em.close();
    }
    
    public static void beginTransaction() {
      getEntityManager().getTransaction().begin();
    }
    
    public static void commit() {
      getEntityManager().getTransaction().commit();
    }  
    
    public static void rollback() {
      getEntityManager().getTransaction().rollback();
    } 
    
    public static Query createQuery(String query) {
    return getEntityManager().createQuery(query);
  }
  
  public static void log(String info, Level level, Throwable ex) {
      logger.log(level, info, ex);
    }
    
}


wureka edited on 2009-07-27 14:35
reply to postreply to post
作者 Re:Geronimo 中的 war 檔,會共同使用一個 JPA 的 persistence.xml 嗎? [Re:wureka]
wureka





發文: 37
積分: 0
於 2009-07-29 21:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我自問自答吧。
我找到原因了。
就是因為我再這兩個 war 中,都開啟了 geronimo 的 shared lib
一旦我關掉他們,就 OK 了。
感覺上, shared lib 會是所有的 war 的 classloader 與 container 的共同區。
不過我不是100%確定。因為還沒時間去測試兩個 war 可否透過 shared lib 來傳遞資料。


reply to postreply to post
作者 Re:Geronimo 中的 war 檔,會共同使用一個 JPA 的 persistence.xml 嗎? [Re:wureka]
mylee





發文: 764
積分: 1
於 2009-07-29 21:26 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感覺上該 lib 可能有 singleton 的 factory method 在每個 war 的初始化執行路徑上。

reply to postreply to post
» JWorld@TW »  Application Server » Tomcat

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8