【问题标题】:How to alter session NLS_COMP/SORT after a perticular query is executed如何在执行特定查询后更改会话 NLS_COMP/SORT
【发布时间】:2024-04-28 22:15:02
【问题描述】:

我的问题是针对一些问题场景,即使用 EntityManager 从 Spring Container 启动事务,然后我从 EntityManager 获取休眠会话。

整体流程:

  1. 在应用程序entityManager.createNativeQuery(searchQuery) 中可以选择一些数据。

  2. 我需要从entityManager 中取出休眠会话,然后在会话中设置nls_comp/nls_sort 或者我可以在entityManager 本身中执行查询。例如更改会话集nls_comp=linguistic

  3. 完成后,我想再次禁用这些选项,使其恢复到以前的状态。很可能是通过关闭休眠会话或某种机制。这是正确的方法吗?

我是否也应该为 2 alter 命令启动另一个事务(我试过它给出了一些异常)。请让我知道如何实现它以及如何在 Spring 启动的事务中管理休眠会话,或者我可以使用 entityManager 本身实现启用/禁用。

【问题讨论】:

    标签: java spring hibernate session nls-comp


    【解决方案1】:

    你可以这样做:

    org.hibernate.Session session = (Session) entityManager.getDelegate();
    session.doWork(new Work() {
        @Override
        public void execute(Connection connection) throws SQLException {
            PreparedStatement statement = null;
            try {                 
                statement = connection.createStatement();
                statement.addBatch("ALTER SESSION SET NLS_COMP = LINGUISTIC");
                statement.addBatch("ALTER SESSION SET NLS_SORT = SPANISH_M");
                statement.executeBatch();
            }
            finally {
                if(statement != null) {
                    statement.close();
                }           
            }                                
        }
    });
    
    1. 您可以使用 getDelegate() 从 entityManager 获取 Session
    2. 您可以在当前关联的连接中执行这两条语句
    3. 这些更改仅适用于当前数据库会话,当连接关闭时,它们应恢复为默认值。对于连接池,您必须检查它们是否被持久化。

    你不需要调用 session.close(),当关闭当前 Transaction 时,thin 会自动被 Spring 处理。您很少需要手动关闭会话。

    如果您想为当前设置执行逻辑,最好编写一个 AOP 方面来执行 1. 和 2. 然后让调用通过,仅将其重置为 finally 块中的先前值。您可以定义自己的注释来标记您希望启用此逻辑的所有服务方法。无论如何,Spring 切入点都支持基于注释的选择。

    【讨论】:

    • 这意味着如果任何其他事务正在使用相同的连接,它们将反映这些更改。我希望这两个设置仅反映在该会话和该连接中。所以如果我启动一个事务并关闭通过执行 (entityManager.getTransaction().begin()/commit()) 或者如果我关闭从 entityManager 获取的会话,那么这两个设置将消失并重置。否则我必须再次将其重置较早的交易。请澄清。
    • 两个事务永远不会同时使用同一个 JDBC 连接。为了安全起见,请选择我在更新回复中提到的 AOP 方面。
    • 如果相同的连接可用于其他事务,它将使用哪个值。如果我在 NLS_PARAMETER 上进行选择,那么它应该提供旧的还是新的。我需要将其重置回连接或关闭连接,使其不会反映在其他人身上。请提出建议。
    • 嗨弗拉德,我不知道如何处理弹簧,请提供一些参考。
    • 如何使用Spring AOP解决上述问题。需要您的指导。
    最近更新 更多