DruidDataSource拷贝一个易错点

本文介绍如何使用Druid为Oracle数据库配置数据源,并设置连接属性、用户名、密码等关键参数。

        DruidDataSource dataSource = this.dataSource.cloneDruidDataSource();
        dataSource.setConnectionProperties(null);   //
        dataSource.setUrl(this.jdbcUrl);
        dataSource.setUsername(this.username);
        dataSource.setPassword(this.password);
        dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        dataSource.setDriver(null);     //非常重要
        try {
          dataSource.setFilters("config");  //
          dataSource.init();
        } catch (SQLException e) {
            logger.error("DataSource cannot available: ", e);
        }
        jdbcTemplate = new JdbcTemplate(dataSource);
        for (KakouCity city : dao.loadAllCities()) {
            cityMap.put(city.getCode(), city);
        }

您是正确的,我之前的代码中确实没有明确定义 `DruidDataSource` 类的使用。`DruidDataSource` 是阿里巴巴 Druid 连接池的核心类,需要正确引入。以下是完整的补充实现: ## 1. 首先确保Maven依赖 在 `pom.xml` 中添加 Druid 依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency> ``` ## 2. Druid配置类 添加专门的 Druid 配置类: ```java @Configuration public class DruidConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.druid") public DruidDataSourceProperties druidProperties() { return new DruidDataSourceProperties(); } @Bean public DataSource dataSource(DruidDataSourceProperties properties) { DruidDataSource dataSource = new DruidDataSource(); properties.config(dataSource); return dataSource; } @Bean public ServletRegistrationBean<StatViewServlet> druidServlet() { ServletRegistrationBean<StatViewServlet> reg = new ServletRegistrationBean<>(); reg.setServlet(new StatViewServlet()); reg.addUrlMappings("/druid/*"); // 白名单 reg.addInitParameter("allow", "127.0.0.1"); // 黑名单 reg.addInitParameter("deny", ""); // 登录查看信息的账号密码 reg.addInitParameter("loginUsername", "admin"); reg.addInitParameter("loginPassword", "admin"); // 是否能够重置数据 reg.addInitParameter("resetEnable", "false"); return reg; } @Bean public FilterRegistrationBean<WebStatFilter> filterRegistrationBean() { FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(); filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; } } ``` ## 3. 更新 DynamicDataSourceServiceImpl 修改数据源创建部分,明确使用 DruidDataSource: ```java @Service public class DynamicDataSourceServiceImpl implements DynamicDataSourceService { // ... 其他代码不变 ... @Override public boolean addDataSource(DataSourceEntity ds) { String dsName = ds.getName(); if (dynamicRoutingDataSource.getDataSources().containsKey(dsName)) { throw new RuntimeException("数据源 " + dsName + " 已存在"); } try { // 明确使用 DruidDataSource DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName(ds.getDriverClassName()); druidDataSource.setUrl(ds.getUrl()); druidDataSource.setUsername(ds.getUsername()); druidDataSource.setPassword(ds.getPassword()); // Oracle特定配置 configureForOracle(druidDataSource); dynamicRoutingDataSource.addDataSource(dsName, druidDataSource); // 测试连接 try (Connection conn = druidDataSource.getConnection()) { logger.info("数据源 {} 连接测试成功", dsName); } return true; } catch (Exception e) { throw new RuntimeException("创建数据源 " + dsName + " 失败", e); } } private void configureForOracle(DruidDataSource dataSource) { dataSource.setInitialSize(5); dataSource.setMinIdle(5); dataSource.setMaxActive(20); dataSource.setMaxWait(60000); dataSource.setTimeBetweenEvictionRunsMillis(60000); dataSource.setMinEvictableIdleTimeMillis(300000); dataSource.setValidationQuery("SELECT 1 FROM DUAL"); dataSource.setTestWhileIdle(true); dataSource.setTestOnBorrow(false); dataSource.setTestOnReturn(false); dataSource.setPoolPreparedStatements(true); dataSource.setMaxPoolPreparedStatementPerConnectionSize(20); // Oracle连接属性 try { Properties properties = new Properties(); properties.setProperty("oracle.net.CONNECT_TIMEOUT", "5000"); properties.setProperty("oracle.jdbc.ReadTimeout", "30000"); dataSource.setConnectProperties(properties); } catch (Exception e) { logger.warn("设置Oracle连接属性失败", e); } } } ``` ## 4. 更新 application.yml 添加 Druid 监控配置: ```yaml spring: datasource: druid: stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin reset-enable: false web-stat-filter: enabled: true url-pattern: /* exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" filter: stat: enabled: true log-slow-sql: true slow-sql-millis: 2000 merge-sql: true wall: enabled: true config: multi-statement-allow: true ``` ## 5. Druid 监控访问 启动应用后,可以通过以下URL访问Druid监控台: ``` http://localhost:8080/druid ``` 使用配置的用户名/密码(默认admin/admin)登录后,可以: 1. 查看所有数据源状态 2. 监控SQL执行情况 3. 查看URI访问统计 4. 监控Session信息 ## 6. 关键说明 1. **DruidDataSource 核心配置参数**: - `initialSize`: 初始化连接数 - `maxActive`: 最大连接数 - `minIdle`: 最小空闲连接 - `maxWait`: 获取连接最大等待时间 2. **Oracle 特别优化**: - `validationQuery`: 使用 `SELECT 1 FROM DUAL` - 设置Oracle特定的超时参数 - 启用预处理语句池 3. **监控功能**: - StatViewServlet 提供监控页面 - WebStatFilter 监控Web请求 - WallFilter 提供SQL防火墙功能 这样完整实现了基于 Druid 连接池的动态数据源管理,特别针对 Oracle 数据库进行了优化配置,并提供了完善的监控功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值