2013-02-04 117 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,是否有可能会通过这些实例共享会话? –