是否可以使用JDBC在po stgresql登录流的启动消息中传递application_name?

问题描述 投票:1回答:1

我正在使用一个解析器,该解析器嗅探网络流量并解析PostgreSQL的消息(服务器版本9.6.11)。我需要能够在登录流中传递application_name参数(在返回成功身份验证之前)表示我不能依赖“ SET application_name”等。

使用JDBC是否可行?例如,使用ODBC可以通过设置libpq参数:application_name=myapp。并且启动消息(https://www.postgresql.org/docs/9.5/protocol-message-formats.html)将在用户名和数据库旁边包含参数。

我正在使用Wireshark进行验证。

我已经尝试在此处阅读一些建议,但是所有解决方案都依赖于登录完成后设置应用程序名称。

我也尝试通过DBeaver的连接设置->驱动程序属性-> ApplicationName,并且得到相同的结果。

Properties props = new Properties();
props.setProperty("user",user);
props.setProperty("password",password);
props.setProperty("ssl","true");
props.setProperty("sslmode","disable");
props.setProperty("ApplicationName","my-app");

try (Connection connection = DriverManager.getConnection("jdbc:postgresql://"+host+
        ":5432/" + db , props)) {

    System.out.println("Java JDBC PostgreSQL Example");
    Class.forName("org.postgresql.Driver");
    System.out.println("Connected to PostgreSQL database!");
    Statement statement = connection.createStatement();
} 

或这个,

Properties props = new Properties();
props.setProperty("user",user);
props.setProperty("password",password);
props.setProperty("ssl","true");
props.setProperty("sslmode","disable");

try (Connection connection = DriverManager.getConnection("jdbc:postgresql://"+host+
        ":5432/" + db+ "?application_name=my-app" , props)) {

    System.out.println("Java JDBC PostgreSQL Example");
    Class.forName("org.postgresql.Driver");
    System.out.println("Connected to PostgreSQL database!");
    Statement statement = connection.createStatement();
}

我正在寻找一种复制ODBC行为的方法。

这与How to set application name in a Postgresql JDBC url?不同。我问是否有可能在完成登录协议之前传递此参数。当我用Wireshark查看消息时,我可以清楚地看到,使用JDBC,所有传递此参数的方法都分解为以下消息序列:

  1. 登录请求
  2. 登录成功
  3. SET application_name = my-app

在ODBC中是这样的:

  1. 登录请求(包含参数application_name)
  2. 登录成功
java postgresql jdbc
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.