我想知道如何在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;
}
}