solon下使用阿里云计算平台的druid连接池监控

solon下使用阿里云计算平台druid连接池监控

solon默认不支持servlet体系,我通过阅读阿里云计算平台druid,根据源码让solon体系支持druid数据库sql监控

下面我以最简单的方案实现solon阿里druid连接池监控。

文章原地址:https://lingkang.top/archives/solon2druid

方案

编写一个controller实现druidweb功能即可,此时是 2025年7月5日

1.依赖

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.2.25</version>
</dependency>

  <!-- 引入 Web 快速开发集成包 -->
<dependency>
  <groupId>org.noear</groupId>
  <artifactId>solon-web</artifactId>
  <version>3.3.0</version>
  <scope>provided</scope>
</dependency>

<!-- Mysql驱动包 -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.33</version>
  <!--<scope>provided</scope>-->
</dependency>

2.main入口

package top.lingkang.druid.jdbc;

import org.noear.solon.Solon;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Mapping;

/**
 * @author lingkang
 * created by 2025/7/5 21:49
 */
@Controller
public class TestJdbc {
   
   
    public static void main(String[] args) {
   
   
        Solon.start(TestJdbc.class, args, solonApp -> {
   
   
            solonApp.context().beanScan("top.lingkang.druid.solon");
        });
    }

    // 用于调用测试
    @Mapping("/sql")
    public String sql() {
   
   
        DbConfig bean = Solon.context().getBean(DbConfig.class);
        return bean.query();
    }

}

3.数据库配置

/**
 * @author lingkang
 * created by 2025/7/5 23:20
 */
@Configuration
public class DbConfig {
   
   

    @Init
    public void init() {
   
   
       // 用于监控测试
        query();
    }

    public String query() {
   
   
        String result = null;
        DruidDataSource dataSource = Solon.context().getBean(DruidDataSource.class);
        String sql = "select * from sys_job_log";

        try (DruidPooledConnection conn = dataSource.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
   
   

            // 设置查询参数
            // pstmt.setInt(1, 18);

            // 执行查询
            try (ResultSet rs = pstmt.executeQuery()) {
   
   
                // 处理查询结果
                while (rs.next()) {
   
   
                    int id = rs.getInt("job_log_id");
                    String name = rs.getString("job_name");
                    int age = rs.getInt("status");
                    result = String.format("ID: %s, 姓名: %s, 年龄: %d%n", id, name, age);
                    System.out.printf(result);
                }
            } catch (SQLException e) {
   
   
                throw new RuntimeException(e);
            }
        } catch (SQLException e) {
   
   
            e.printStackTrace();
        }

        return result;
    }

    @Bean
    public DruidDataSource dataSource() throws SQLException {
   
   
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");

        // 配置连接池参数
        dataSource.setInitialSize(1);
        dataSource.setMinIdle(1);
        dataSource.setMaxActive(5);
        dataSource.setMaxWait(60000);
        dataSource.setTimeBetweenEvictionRunsMillis(60000);
        dataSource.setMinEvictableIdleTimeMillis(300000);
        dataSource.setValidationQuery("SELECT 1");
        dataSource.setTestWhileIdle(true);
        dataSource.setTestOnBorrow(false);
        dataSource.setTestOnReturn(false);
        dataSource.setPoolPreparedStatements(true);
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
        

        // 配置监控统计拦截的filters
        dataSource.setFilters("stat,wall"); // stat:SQL监控 wall:防火墙 log4j:日志记录

        // SQL监控配置
        dataSource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000");
        // mergeSql:合并SQL slowSqlMillis:超过1秒的SQL视为慢SQL

        return dataSource;
    }
}

4.编写controller

注意,代码指定了本地才能访问,账号密码是:druid/123456

  • 没有实现url监控(非全局过滤,提高性能)
  • 没有实现session监控(无须session监控)
  • 没有spring监控
package top.lingkang.druid.solon;

import com.alibaba.druid.DbType;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.stat.DruidStatManagerFacade;
import com.alibaba.druid.support.http.stat.WebAppStat;
import com.alibaba.druid.support.http.stat.WebAppStatManager;
import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.druid.support.spring.stat.SpringStatManager;
import com.alibaba.druid.util.MapComparator;
import com.alibaba.druid.util.StringUtils;
import com
posted @ 2025-07-06 01:56  凌康  阅读(1)  评论(0)    收藏  举报  来源