solon下使用阿里云计算平台的druid连接池监控
solon下使用阿里云计算平台druid连接池监控
solon默认不支持servlet体系,我通过阅读阿里云计算平台druid,根据源码让solon体系支持druid数据库sql监控
下面我以最简单的方案实现solon阿里druid连接池监控。
文章原地址:https://lingkang.top/archives/solon2druid
方案
编写一个controller实现druid的web功能即可,此时是 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

浙公网安备 33010602011771号