如何在Oracle中使用Spring/myBatis设置客户端标识符



我想知道如何在Oracle中设置CLIENT_IDENTIFIER参数,以便在调用数据库期间使应用程序用户可用。我正在使用Spring框架与myIbatis。

如果你能给我具体的指导,我将非常感激,因为我不是使用这些技术的专家。

查看Oracle文档setEndToEndMetrics旧版本;12 c setClientInfo .

无论哪种情况,你都需要一个真正的连接,而不是代理。

与调用DBMS_APPLICATION_INFO相比,使用这种方法的优点是它不需要往返数据库。该信息将在下一次JDBC调用时传输和设置。

下面是iBatis的一个简单示例。

1)你必须解除连接以获得真正的Oracle连接

 Connection con = unwindConnection(sqlMapClient.getCurrentConnection());

2)定义端到端标识符-在每个操作之前从池或事件请求连接后更正声明

  String[] metrics = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];
 metrics[OracleConnection.END_TO_END_ACTION_INDEX] = 'myAction3';
 metrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = 'myClient3';
 metrics[OracleConnection.END_TO_END_MODULE_INDEX] = 'myModule3';
 con.setEndToEndMetrics(metrics, (short) 0);

3)在下一次JDBC到DB的往返之后,标识符被设置为

 select    ACTION, CLIENT_IDENTIFIER, MODULE 
 from v$session where ....
 myAction3   myClient3   myModule3

For CLIENT_INFO

BEGIN DBMS_APPLICATION_INFO.SET_CLIENT_INFO('whatever'); END; 
为CLIENT_IDENTIFIER

BEGIN DBMS_SESSION.SET_IDENTIFIER('whatever'); END;

您可以使用Spring AOP进行设置。编写一个方面,无论何时调用getConnection方法都将调用它。

@Component
@Aspect
public class ClientIdentifierConnectionPreparer implements ConnectionPreparer {
    private String prepSql = "{ call DBMS_SESSION.SET_IDENTIFIER(?) }";
    @Autowired
    private UserService userService;
    @AfterReturning(value="execution(java.sql.Connection javax.sql.DataSource.getConnection(..))" returning="connection")
    public Connection prepare(Connection connection) {
        CallableStatement cs = connection.prepareCall(prepSql);
        cs.setString(1,userService.getUserId());
        cs.execute();
        cs.close();
        return connection;
    }
}

最新更新