Есть ли способ установить APPL_NAME в соединении DB2 внешне вместо "db2jcc_application" (например, с помощью свойства системы) - PullRequest
0 голосов
/ 16 февраля 2019

Я использую приложение Java, которое подключается к DB2 через JDBC.Он создает соединение таким образом, чтобы имя приложения (sysibmadm.applications -> APPL_NAME) оставалось по умолчанию в JDBC "db2jcc_application".Есть ли способ извне установить для APPL_NAME желаемое значение?(например, в Oracle я могу передать -Doracle.jdbc.v$session.program=MyApplName, чтобы получить аналогичный эффект).

Я хочу сделать это, чтобы я мог четко идентифицировать все соединения, входящие в мою DB2.В настоящее время все Java-приложения отображаются как "db2jcc_application".

Я написал небольшой фрагмент кода, чтобы проиллюстрировать это ...

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DB2ApplName {
    public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException {
        Class.forName("com.ibm.db2.jcc.DB2Driver");

        Properties connProps = new Properties();
        connProps.put("user", "<my db2 user>");
        connProps.put("password", "<my db2 password>");

        // Create a connection **WITHOUT** Application Name
        Connection connWithoutApplName = DriverManager.getConnection("jdbc:db2://<ip>:<port>/<dbname>",
                                                                     connProps);

        // Add Application Name to the properties
        connProps.put("clientProgramName", "MyApplName");
        // Create a connection **WITH** Application Name
        Connection connWithApplName = DriverManager.getConnection("jdbc:db2://<ip>:<port>/<dbname>",
                                                                  connProps);
        System.out.println("Sleeping for 60 seconds - check the connections.");
        Thread.sleep(60000L); // During this time I will run query on DB2 to see connection details.

        connWithoutApplName.close();
        connWithApplName.close();
    }
}

Этот код создает два соединения: одно без набора ApplName и одно с ApplName set.

Когда код находится в Thread.sleep, я запрашиваю db ...

select appl_name from sysibmadm.applications
where client_nname = '<my client ip>' with ur;

APPL_NAME         
------------------
db2jcc_application
MyApplName        

Как видите, у второго соединения правильно проставлена ​​отметка имени приложения, но первое соединение просто имеет "db2jcc_application" в качестве имени.Но, конечно, я мог бы сделать это, только если бы я мог изменить код приложения - что я не могу.

Второй способ, который я нашел, что я могу сделать это, установив URL JDBC в настройках / свойствах приложения вособая мода.Вместо того, чтобы просто использовать JDBCURL=jdbc:db2://<ip>:<port>/<dbname> в настройках приложения, если я установил JDBCURL=jdbc:db2://<ip>:<port>/<dbname>:clientProgramName=MyApplName;, тогда имя приложения будет напечатано правильно.К сожалению, для определенных приложений, которые у нас есть, нам нужно запустить несколько процессов JVM, но я не могу установить вышеупомянутые настройки отдельно для каждого из этих процессов.Я могу установить параметры JVM (например, -D параметры) отдельно для каждого процесса.

Таким образом, я смотрю, есть ли способ извне передать имя приложения, чтобыдрайвер JDBC подберет его и поставит отметку на соединении.

1 Ответ

0 голосов
/ 16 февраля 2019

Ниже приведен список доступных свойств, которые можно установить с помощью параметра JVM или файла свойств:
Свойства драйвера IBM Data Server для JDBC и SQLJ .
В соответствии с этимссылка, вы не можете установить свойство clientProgramName таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...