更新时间:2024-11-12 GMT+08:00
分享

监控数据库连接

连接监控功能支持监控JDBC端以下指标:应用开启连接的次数、关闭连接的次数、连接异常断开的次数、数据库访问量、客户端机器CPU的使用率、内存的使用率、上下行传输速率、应用端到数据库链路之间的网络时延、抖动、丢包率。此示例将演示如何使用JDBC驱动的连接监控功能。

代码运行的前提条件:根据实际情况添加gaussdbjdbc.jar包(例如用户使用IDE执行代码,则需要在本地IDE添加gaussdbjdbc.jar包)。

// 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。
// 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
// $ip、$port、database需要用户自行修改。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBMonitorTest {

    public static void main(String[] args){
        String driver = "com.huawei.gaussdb.jdbc.Driver";
        String username = System.getenv("EXAMPLE_USERNAME_ENV");
        String passwd = System.getenv("EXAMPLE_PASSWORD_ENV");
        String sourceURL
            = "jdbc:gaussdb://$ip:$port/database?dbMonitor=true&loggerLevel=debug&loggerFile=dbMonitor.log";
        try {
            // 加载数据库驱动。
            Class.forName(driver).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        Connection conn = null;
        Statement statement = null;
        try {
            //以非加密方式连接数据库。
            conn = DriverManager.getConnection(sourceURL, username, passwd);
            System.out.println("Connection succeed!");

            // 创建表。
            statement = conn.createStatement();
            String createTableQuery = "CREATE TABLE IF NOT EXISTS mytable (id INT PRIMARY KEY, name VARCHAR(50))";
            statement.executeUpdate(createTableQuery);

            // 插入数据。
            String insertQuery = "INSERT INTO mytable (id, name) VALUES (1, 'John')";
            statement.executeUpdate(insertQuery);

            // 查询数据。
            String selectQuery = "SELECT * FROM mytable ";
            ResultSet resultSet = statement.executeQuery(selectQuery);
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("id: " + id + ", name: " + name);
            }

            // 删除表。
            String dropTableQuery = "DROP TABLE IF EXISTS mytable";
            statement.executeUpdate(dropTableQuery);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

上述示例的运行结果为:

Connection succeed!
id: 1, name: John

在日志文件dbMonitor.log中可以看到输出的连接监控信息,具体包括:

Nov 23, 2023 10:30:54 AM com.huawei.gaussdb.jdbc.qos.DataProcess saveQosResult
FINE: {
   "Destination host:port" : "ip:port",--服务器的IP和端口。
   "Delay" : "1.00 ms",--网络时延。
   "Jitter" : "0.04ms",--网络抖动。
   "Loss" : "0%",--网络丢包率。
   "DownloadSpeed" : "0.395Mbps",--网络下行速率。
   "UpLoadSpeed" : "0.498Mbps"--网络上行速率。
}

Nov 23, 2023 10:30:56 AM com.huawei.gaussdb.jdbc.CollectDBData$CollectDBThread run
FINE: {
   "openCount": "1",--应用开启数据库连接的次数。
   "closeCount": "1",--应用关闭数据库连接的次数。
   "abortedCount": "0",--连接异常断开的次数。
   "visitCount": "12",--应用对数据库的访问量。
   "cpuUsage": "20.39%",--客户端机器CPU的使用率。
   "memoryUsage": "98.32%"--客户端机器内存的使用率。
}

相关文档