2013-02-04 84 views
2

我不得不使用特定的NLS_LANGUAGE訪問數據庫,並且不想更改user.locale以避免影響應用程序的其餘部分。像這樣的事情可以做或可以導致意想不到的問題?使用原生查詢更改單個JPA查詢

此外,會話的範圍有多大?這是否會影響這個單一的查詢,或每個調用使用相同的entityManager,甚至整個應用程序?

@Stateless 
@Local 
public class myDAOImpl implements MyDAO{ 

    @PersistenceContext(unitName = "MyUnit") 
    protected EntityManager em; 

    public List<Object> getSomeData(){ 
     em.createNativeQuery("alter session set nls_language = 'AMERICAN'").executeUpdate();  
     Query q = em.createNativeQuery("Select * from my_view"); 
     return q.getResultList(); 
    } 

} 
+0

爲什麼你需要爲一個查詢使用不同的'nls_language'?也許這是可以在查詢中解決的問題,例如使用'to_char'函數 –

+0

如果nls_language未設置爲'AMERICAN',則會在db上執行次優執行計劃,導致它永遠掛起。我聽說過某些指標會被忽略。我知道瘋狂的設計,但是我無法改變那裏的任何東西。 –

回答

2

oracle上的更改會話將影響該連接上的所有未來請求。因此,如果您正在使用連接池,則會影響在同一連接上打開的所有未來會話。

+0

這將如何與EntityManager一起工作?它本身是一個游泳池嗎? –

+0

EntityManager只是JPA的會話等效類,由各種JPA實現在內部實現以提供功能。 Hibernate實際上使用Session來支持EntityManager。 EntityManager本身不保存池。在JPA中,你可以用persistence.xml或編程方式(或通過Spring)來配置它。游泳池是一個較低層次的概念。 EntityManager在更高層次上工作。 –

+0

那麼它如何使用默認設置?單個實體管理器將處理多少個會話? 1還是很多?如果將MyDao的多個實例合併爲EJB,是否有可能會通過這些實例共享會話? –