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

时间:2015-09-14 18:28:27

标签: spring oracle mybatis

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

如果你能给我一些如何做到这一点的精确指示,我将非常感激,因为我不是使用这些技术的专家。

3 个答案:

答案 0 :(得分:2)

检查旧版本的 setEndToEndMetrics 的Oracle文档;为12c setClientInfo

在任何一种情况下,您都需要真正的连接,而不是代理。

与调用DBMS_APPLICATION_INFO相比,使用此方法的优点是它不需要往返数据库。使用下一个JDBC调用传输和设置信息。

<强>更新

iBatis的一个简单示例如下。

1)您必须unwind the connection才能获得真正的Oracle连接

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

2)定义E2E标识符 - 在每次操作之前从池或事件请求连接后更正所述

  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

答案 1 :(得分:1)

对于CLIENT_INFO

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

对于CLIENT_IDENTIFIER

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

答案 2 :(得分:0)

您可以使用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;
    }
}