我正在使用一个解析器,该解析器嗅探网络流量并解析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,所有传递此参数的方法都分解为以下消息序列:
在ODBC中是这样的: