我想知道如何在Oracle中设置CLIENT_IDENTIFIER参数,以便在调用数据库期间使应用程序用户可用。我正在使用带有myIbatis的Spring框架。
如果你能给我一些如何做到这一点的精确指示,我将非常感激,因为我不是使用这些技术的专家。
答案 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;
}
}