注册
sqllog通过appname区分不同语言发送的请求
专栏/技术分享/ 文章详情 /

sqllog通过appname区分不同语言发送的请求

wuran 2026/04/24 27 0 0
摘要

同一台服务器部署的同一个应用,应用使用同一个用户连接数据库,如果应用是多种语言混合开发的,sqllog可通过appname区分不同语言发送的请求。
SQLLOG日志中的appname字段表示客户端应用程序的名称,JDBC语言的appname字段的值是通过客户端连接参数配置,如果在连接字符串中没有显式配置应用名,则appname会显示为空,需要在应用框架的数据库连接配置中显式指定应用名。OCI、ODBC、DIP等的appname默认识别为客户端程序名称。
1、JDBC示例:
private static final String URL = “jdbc:dm://192.168.112.166:5237?appname=my_application&StmtPoolSize=0”;
2、OCI自动识别程序名为appname,无需单独配置
windows环境:appname:程序名.exe
linux环境:appname:程序名
3、odbc自动识别程序名为appname,无需单独配置
windows环境:appname:odbcad32.exe
linux环境:appname:isql
4、dpi自动识别程序名为appname,无需单独配置
windows环境:appname:DIsql.exe
linux环境:appname:disql

一、ODBC

odbc自动识别程序名为appname,无需单独配置,暂时无手动配置appname方案。
windows环境:appname:odbcad32.exe
linux环境:appname:isql
详细测试步骤如下:

1、win10

“ODBC 数据源管理程序”界面,系统DSN选项中,添加系统数据源,选择“DM8 ODBC DRIVER”;
图片8.png
图片9.png
对应的sqllog:

2026-04-16 20:13:01.659 (EP[0] sess:00000000794F8C58 thrd:23488 user:SYSDBA trxid:0 stmt:NULL appname:odbcad32.exe ip:::1) [LGN] LOGIN
2026-04-16 20:13:01.658 (EP[0] sess:00000000795635B8 thrd:-1 user:NULL trxid:0 stmt:NULL appname:) NTSK EXEC SQL ALLOC SESSION
2026-04-16 20:13:01.659 (EP[0] sess:00000000794F8C58 thrd:23488 user:SYSDBA trxid:0 stmt:NULL appname:odbcad32.exe ip:::1) [LGN] FREE SESSION

2、Linux

1)安装gcc

yum install -y gcc

2)安装unixODBC-2.3.0

cd /usr/local
tar -xzvf unixODBC-2.3.0.tar.gz
cd unixODBC-2.3.9
./configure
make && make install
odbc_config --version

3)配置odbc

vi /etc/profle
export ODBCINI=/usr/local/etc/odbc.ini
export ODBCSYSINI=/usr/local/etc/
source /etc/profile
如果安装后发现odbc配置文件指向了/etc下,可配置odbc环境变量。
/usr/local/etc下方便调整目录权限,放在/etc下,部分场景会出现权限问题。

vi /usr/local/etc/odbc.ini
[dm8]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER
SERVER = localhost
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 5237
注:TCP_PORT,千万不要配置成PORT。

vi /usr/local/etc/odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
DRIVER = /home/dmdba/dmdbms/bin/libdodbc.so
注意:odbc.ini 中的 Driver 内容一定要与 odbcinst.ini 中的达梦驱动定义的节点名称相同。

chmod 775 odbc.ini
chmod 775 odbcinst.ini

odbcinst -j查看配置文件路径
![图片10.png](https://download.dameng.com/eco-file-server/file/eco/preview/20260417143722FPAO37JFUVPYXWOP80)

4)查询

[root@www ~]# isql -v dm8
s+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>select 1;
+------------+
| 1          |
+------------+
| 1          |
+------------+
SQLRowCount returns 1
1 rows fetched
SQL>

5)对应的sqllog

2026-04-16 20:08:54.665 (EP[0] sess:0x7fdde0536578 thrd:17636 user:SYSDBA trxid:0 stmt:NULL appname:isql ip:::1) ALLOC STMT^M
2026-04-16 20:08:54.670 (EP[0] sess:0x7fdde0536578 thrd:17636 user:SYSDBA trxid:0 stmt:0x7fdde0533f90 appname:isql ip:::1) [ORA]: select 1;^M
2026-04-16 20:08:54.674 (EP[0] sess:0x7fdde0536578 thrd:17636 user:SYSDBA trxid:36271 stmt:NULL appname:isql ip:::1) TRX: START^M
2026-04-16 20:08:54.691 (EP[0] sess:0x7fdde0536578 thrd:17636 user:SYSDBA trxid:36271 stmt:0x7fdde0533f90 appname:isql ip:::1) GET SQL NEW PLN:  select 1;

1   #NSET2: [1, 1, 1]
2     #PRJT2: [1, 1, 1]; exp_num(1), is_atom(FALSE)
3       #CSCN2: [1, 1, 1]; SYSINDEXSYSDUAL(SYSDUAL); btr_scan(1)^M

二、JDBC

连接串添加appname=my_application。

1、demo

package test;

import java.sql.*;

public class JdbcTest {

    public static void main(String[] args)  throws Exception{
            Class.forName("dm.jdbc.driver.DmDriver");
            Connection conn = DriverManager.getConnection(
                    "jdbc:dm://127.0.0.1:5237?appname=my_application", "SYSDBA", "Dameng123");
            ResultSet rs = null;
            PreparedStatement perstmt = null;

        try {
            String sql = "select *  from v$sessions;";
            perstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            rs = perstmt.executeQuery(sql);
            rs.last();
            System.out.println(rs.getRow());
            while (rs.next()) {
                System.out.println(rs.getObject(1));
                System.out.println(rs.getObject(2));
                System.out.println(rs.getObject(3));
            }
        } catch (SQLException e) {
            System.out.println("错误码="+e.getErrorCode());
            e.printStackTrace();
        } finally {
            DmUtils.close(conn, perstmt, rs);
        }

    }

}

2、对应的sqllog

2026-04-16 20:51:07.911 (EP[0] sess:00000000794F8C58 thrd:18720 user:SYSDBA trxid:0 stmt:NULL appname:my_application ip:127.0.0.1) ALLOC STMT
2026-04-16 20:51:07.926 (EP[0] sess:00000000794F8C58 thrd:18720 user:SYSDBA trxid:0 stmt:000000028253B148 appname:my_application ip:127.0.0.1) [ORA]: select *  from v$sessions;
2026-04-16 20:51:07.926 (EP[0] sess:00000000794F8C58 thrd:18720 user:SYSDBA trxid:771557 stmt:NULL appname:my_application ip:127.0.0.1) TRX: START
2026-04-16 20:51:07.926 (EP[0] sess:00000000794F8C58 thrd:18720 user:SYSDBA trxid:771557 stmt:000000028253B148 appname:my_application ip:127.0.0.1) [SEL] select *  from v$sessions;
2026-04-16 20:51:07.926 (EP[0] sess:00000000794F8C58 thrd:18720 user:SYSDBA trxid:771557 stmt:000000028253B148 appname:my_application ip:127.0.0.1) [ORA]: select *  from v$sessions;
2026-04-16 20:51:07.926 (EP[0] sess:00000000794F8C58 thrd:18720 user:SYSDBA trxid:771557 stmt:NULL appname:my_application ip:127.0.0.1) TRX: COMMIT

三、DMOCI

OCI自动识别程序名为appname,无需单独配置,暂时无手动配置appname方案。
windows环境:appname:程序名.exe
linux环境:appname:程序名

1、demo

详细部署流程见:
https://eco.dameng.com/community/post/20260415173004B4K9X4IP4BPCTOTPUE

/************************************************************************/
/* DCI编程实例 
create table sysdba.person(personid varchar(20), sex varchar(20), name varchar(20), email varchar(20), phone varchar(20));
insert into sysdba.person(personid,sex, name, email, phone) values('111','FM','张三','z@g.com','027-00');
commit;
*/
/************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include "DCI.h"
/* 声明句柄 */
OCIEnv* envhp; /* 环境句柄 */
OCISvcCtx* svchp; /* 服务环境句柄 */
OCIServer* srvhp; /* 服务器句柄 */
OCISession* authp; /* 会话句柄 */
OCIStmt* stmthp; /* 语句句柄 */
OCIDescribe* dschp; /* 描述句柄 */
OCIError* errhp; /* 错误句柄 */
OCIDefine* defhp[3]; /* 定义句柄 */
OCIBind* bidhp[4]; /* 绑定句柄 */
sb2 ind[3]; /* 指示符变量 */
/* 绑定select结果集的参数 */
text szpersonid[11]; /* 存储personid列 */
text szsex[20]; /* 存储sex列 */
text szname[51]; /* 存储name列 */
text szemail[51]; /* 存储mail列 */
text szphone[26]; /* 存储phone列 */
char sql[256]; /* 存储执行的sql语句*/
int main(int argc, char* argv[])
{
    char strServerName[50];
    char strUserName[50];
    char strPassword[50];
    char strAppName[50];
    int ret;
    text errbuf[100];
    /* 设置服务器,用户名和密码 */
    strcpy(strServerName, "localhost:5237");
    strcpy(strUserName, "SYSDBA");
    strcpy(strPassword, "Dameng123");
    /* strcpy(strAppName, "my_oci");*/
    /* 初始化OCI应用环境*/
    OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL);
    /* 初始化环境句柄 */
    OCIEnvInit(&envhp, OCI_DEFAULT, 0, 0);
    /* 分配句柄 */
    OCIHandleAlloc(envhp, (dvoid**)&svchp, OCI_HTYPE_SVCCTX, 0, 0); /*服务器环境句柄*/
    OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, 0, 0); /* 服务器句柄*/
    OCIHandleAlloc(envhp, (dvoid**)&authp, OCI_HTYPE_SESSION, 0, 0); /* 会话句柄 */
    OCIHandleAlloc(envhp, (dvoid**)&errhp, OCI_HTYPE_ERROR, 0, 0); /* 错误句柄 */
    OCIHandleAlloc(envhp, (dvoid**)&dschp, OCI_HTYPE_DESCRIBE, 0, 0); /*描述符句柄*/
    /* 连接服务器 */
    OCIServerAttach(srvhp, errhp, (text*)strServerName, (sb4)strlen(strServerName), OCI_DEFAULT);
    /* 设置用户名和密码 */
    OCIAttrSet(authp, OCI_HTYPE_SESSION, (text*)strUserName, (ub4)strlen(strUserName), OCI_ATTR_USERNAME, errhp);
    OCIAttrSet(authp, OCI_HTYPE_SESSION, (text*)strPassword, (ub4)strlen(strPassword), OCI_ATTR_PASSWORD, errhp);
    /* OCIAttrSet(authp, OCI_HTYPE_SESSION, (text*)strAppName, (ub4)strlen(strAppName), OCI_ATTR_APP_NAME, errhp); */
    /* 设置服务器环境句柄属性 */
    OCIAttrSet((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX,
        (dvoid*)srvhp, (ub4)0, OCI_ATTR_SERVER, errhp);
    OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid*)authp,
        0, OCI_ATTR_SESSION, errhp);




    /* 创建并开始一个用户会话 */
    OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);
    OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, 0, 0); /* 语句句柄 */
    ///************************************************************************/
    ///* 查询person表 */
    ///************************************************************************/
    strcpy(sql, "select personid, name, phone from sysdba.person");
    /* 准备SQL语句 */
    OCIStmtPrepare(stmthp, errhp, (text*)sql, (sb4)strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
    /* 绑定输出列 */
    OCIDefineByPos(stmthp, &defhp[0], errhp, 1, (ub1*)szpersonid,
        sizeof(szpersonid), SQLT_STR, &ind[0], 0, 0, OCI_DEFAULT);
    OCIDefineByPos(stmthp, &defhp[1], errhp, 2, (ub1*)szname,
        sizeof(szname), SQLT_STR, &ind[1], 0, 0, OCI_DEFAULT);
    OCIDefineByPos(stmthp, &defhp[2], errhp, 3, (ub1*)szphone,
        sizeof(szphone), SQLT_STR, &ind[2], 0, 0, OCI_DEFAULT);
    /* 执行SQL语句 */
    ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, 0, NULL, NULL, OCI_DEFAULT);
    if (ret != 0)
    {
        OCIErrorGet(errhp, 1, NULL, &ret, (OraText*)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
        printf("%s\n", errbuf);
    }
    printf("%-10s%-10s%-10s\n", "PERSONID", "NAME", "PHONE");
    while ((OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) != OCI_NO_DATA)
    {
        printf("DEBUG: FETCH ROW \n");
        printf("%-10s", (char*)szpersonid);
        printf("%-10s", (char*)szname);
        printf("%-10s\n", (char*)szphone);
    }
    /************************************************************************/
    /* 向person表插入一条数据 */
    /************************************************************************/
    memset(sql, 0, sizeof(sql));
    strcpy(sql, "insert into sysdba.person(sex, name, email, phone) values(:sex,:name,:email,:phone)");
    /* 准备SQL语句 */
    OCIStmtPrepare(stmthp, errhp, (text*)sql, (sb4)strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
    /* 设置输入参数 */
    memset(szsex, 0, sizeof(szsex));
    strcpy((char*)szsex, "FM");
    memset(szname, 0, sizeof(szname));
    strcpy((char*)szname, "张三");
    memset(szemail, 0, sizeof(szemail));
    strcpy((char*)szemail, "z@g.com");
    memset(szphone, 0, sizeof(szphone));
    strcpy((char*)szphone, "027-00");
    /* 绑定输入列 */
    OCIBindByName(stmthp, &bidhp[0], errhp, (text*)":sex", 4, (dvoid*)szsex, (sb4)strlen((char*)szsex),
        SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);
    OCIBindByName(stmthp, &bidhp[1], errhp, (text*)":name", 5, (dvoid*)szname, (sb4)strlen((char*)szname),
        SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);
    OCIBindByName(stmthp, &bidhp[2], errhp, (text*)":email", 6, (dvoid*)szemail, (sb4)strlen((char*)szemail),
        SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);
    OCIBindByName(stmthp, &bidhp[3], errhp, (text*)":phone", 6, (dvoid*)szphone, (sb4)strlen((char*)szphone),
        SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);
    /* 执行SQL语句 */
    ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot*) 0, (OCISnapshot*)0,
        (ub4)OCI_DEFAULT);
    if (ret != 0)
    {
        OCIErrorGet(errhp, 1, NULL, &ret, (OraText*)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
        printf("%s\n", errbuf);
    }
    /* 提交到数据库 */
    OCITransCommit(svchp, errhp, OCI_DEFAULT);

    //结束会话
    OCISessionEnd(svchp, errhp, authp, (ub4)0);
    //断开与数据库的连接
    OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
    //释放OCI句柄
    OCIHandleFree((dvoid*)dschp, OCI_HTYPE_DESCRIBE);
    OCIHandleFree((dvoid*)stmthp, OCI_HTYPE_STMT);
    OCIHandleFree((dvoid*)errhp, OCI_HTYPE_ERROR);
    OCIHandleFree((dvoid*)authp, OCI_HTYPE_SESSION);
    OCIHandleFree((dvoid*)svchp, OCI_HTYPE_SVCCTX);
    OCIHandleFree((dvoid*)srvhp, OCI_HTYPE_SERVER);
    return 0;
}

2、对应的sqllog

1)windows环境

2026-04-17 11:37:03.744 (EP[0] sess:0000000079E63298 thrd:30784 user:SYSDBA trxid:0 stmt:NULL appname:TEST_OCI.exe ip:::1) ALLOC STMT
2026-04-17 11:37:03.744 (EP[0] sess:0000000079E63298 thrd:30784 user:SYSDBA trxid:0 stmt:0000000280DF2148 appname:TEST_OCI.exe ip:::1) [ORA]: select personid, name, phone from sysdba.person
2026-04-17 11:37:03.760 (EP[0] sess:0000000079E63298 thrd:30784 user:SYSDBA trxid:785055 stmt:NULL appname:TEST_OCI.exe ip:::1) TRX: START
2026-04-17 11:37:03.759 (EP[0] sess:0000000079EA7B58 thrd:-1 user:SYSDBA trxid:785054 stmt:NULL appname:) trx[785054] alloc pseg page[0, 2415], page_lsn[15898179], n_pages[1]
2026-04-17 11:37:03.760 (EP[0] sess:0000000079E63298 thrd:30784 user:SYSDBA trxid:785055 stmt:0000000280DF2148 appname:TEST_OCI.exe ip:::1) [SEL] select personid, name, phone from sysdba.person

2)linux环境

2026-04-17 13:28:38.039 (EP[0] sess:0x7f62fea7b728 thrd:59752 user:TESTUSER trxid:0 stmt:NULL appname:TEST_OCI ip:::1) TRX: COMMIT LSN[14631277]
2026-04-17 13:28:38.039 (EP[0] sess:0x7f62fea7b728 thrd:59752 user:TESTUSER trxid:0 stmt:0x7f62ffb15520 appname:TEST_OCI ip:::1) PREPARE
2026-04-17 13:28:38.039 (EP[0] sess:0x7f62fea7b728 thrd:59752 user:TESTUSER trxid:0 stmt:0x7f62ffb15520 appname:TEST_OCI ip:::1) [ORA]: select c1 from DM9TEST
2026-04-17 13:28:38.039 (EP[0] sess:0x7f62fea7b728 thrd:59752 user:TESTUSER trxid:1521098 stmt:NULL appname:TEST_OCI ip:::1) TRX: START
2026-04-17 13:28:38.039 (EP[0] sess:0x7f62fea7b728 thrd:59752 user:TESTUSER trxid:1521098 stmt:0x7f62ffb15520 appname:TEST_OCI ip:::1) [SEL] select c1 from DM9TEST
2026-04-17 13:28:38.039 (EP[0] sess:0x7f62fea7b728 thrd:59752 user:TESTUSER trxid:1521098 stmt:0x7f62ffb15520 appname:TEST_OCI ip:::1) DLCK used time:0(us)
2026-04-17 13:28:38.039 (EP[0] sess:0x7f62fea7b728 thrd:59752 user:TESTUSER trxid:1521098 stmt:0x7f62ffb15520 appname:TEST_OCI ip:::1) [SEL] select c1 from DM9TEST EXECTIME: 0(ms) ROWCOUNT: 1(rows) EXEC_ID: 709.

四、DPI

dpi自动识别程序名为appname,无需单独配置,暂时无手动配置appname方案。
windows环境:appname:DIsql.exe
linux环境:appname:disql

1、windows环境

图片11.png

2026-04-17 11:52:21.858 (EP[0] sess:00000000797B3298 thrd:19228 user:SYSDBA trxid:0 stmt:NULL appname:DIsql.exe ip:::1) [LGN] LOGIN
2026-04-17 11:52:21.870 (EP[0] sess:00000000797F7B58 thrd:-1 user:SYSDBA trxid:791065 stmt:NULL appname:) TRX: START
2026-04-17 11:52:21.858 (EP[0] sess:00000000797B3298 thrd:19228 user:SYSDBA trxid:0 stmt:NULL appname:DIsql.exe ip:::1) ALLOC STMT
2026-04-17 11:52:21.874 (EP[0] sess:00000000797B3298 thrd:19228 user:SYSDBA trxid:0 stmt:0000000280E0A148 appname:DIsql.exe ip:::1) [ORA]: select user;
2026-04-17 11:52:21.886 (EP[0] sess:00000000797F7B58 thrd:-1 user:SYSDBA trxid:791065 stmt:NULL appname:) trx[791065] alloc pseg page[0, 2815], page_lsn[15898485], n_pages[1]

2、linux环境

图片12.png

2026-04-17 11:54:40.878 (EP[0] sess:0x7f4d6c015ae8 thrd:1578 user:SYSDBA trxid:42073 stmt:0x7f4d6c011c78 appname:disql ip:::1) [SEL] select user; EXECTIME: 322(ms) ROWCOUNT: 1(rows) EXEC_ID: 600.^M
2026-04-17 11:54:40.882 (EP[0] sess:0x7f4d6c015ae8 thrd:1578 user:SYSDBA trxid:42073 stmt:NULL appname:disql ip:::1) MSG: COMMIT^M
2026-04-17 11:54:40.882 (EP[0] sess:0x7f4d6c015ae8 thrd:1578 user:SYSDBA trxid:42073 stmt:NULL appname:disql ip:::1) TRX: COMMIT^M
2026-04-17 11:54:43.148 (EP[0] sess:0x7f4d6c015ae8 thrd:1578 user:SYSDBA trxid:0 stmt:0x7f4d6c011c78 appname:disql ip:::1) [ORA]: select 1;^M
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服