监控数据库连接
连接监控功能支持监控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%"--客户端机器内存的使用率。 }