记一次BUG: set / map 添加元素失败??? /* (strict weak ordering) */


BUG 描述

记录一个纠结了一天的 BUG:
向 set 容器中添加自定义类, 然后发现并没有添加进去, 真的是头大, 排查发现告诉我已经有相同 key 值元素存在了, 可我明明两个值不同

set / map 的 insert / emplace 的返回值

c++11 标准引入了 emplace, 与 insert 相对应. empalce 操作构造而不是拷贝元素。

  1. 当我们调用 insert 时, 我们将元素类型的对象传递给它们, 这些类型被拷贝到容器中
  2. 当我们调用 emplace, 会在容器管理的内存空间内直接创建对象。
    注:
  3. emplace 的参数根据元素的类型变化, 参数必须与元素类型的构造函数相匹配
  4. insert 和 emplace 只有在关键值 key 在容器中不存在时, 才会把该元素插入容器中, 否则如果容器中有关键值为 key 元素, 则什么也不做
  5. insert 和 emplace 的返回值是一个 pair, 它的 first 是一个迭代器 指向具有给定关键字的元素 second 是一个 bool 指出元素是否插入成功

因为当时 emplace 失败时也并没有抛异常, 但是这个返回值中的 bool 值为 false 告诉了我就是没有插入进去

set / map 的去重

在自定义类中重载 < 操作符, 或者重载 () 运算符
当时想的比较简单, 因为我的需求只是按时间排序, 所以就简单地写成了这种形式

bool operator<(const A& t) const 
{
	return val < t.v(); //比较两个对象中的时间值, 小的就在前
} 
### 解决初始化 P6Spy MySQL 数据源时出现的 JDBC URL 错误 当遇到 `CannotGetJdbcConnectionException` 异常,提示数据库类型不支持或URL配置有误时,通常是因为 JDBC 连接字符串中的参数设置不当或是驱动类名未正确指定。 对于给定的情况,原始连接字符串为: ```plaintext jdbc:mysql://localhost:3307/lmcms_v4.0_base_160831?useUnicode=true&characterEncoding=UTF-8 [^1] ``` 而出现问题的数据源配置如下所示: ```yaml spring: datasource: dynamic: p6spy: true # 默认false,建议线上关闭。 product: username: sa password: "" url: jdbc:h2:mem:test driver-class-name: org.h2.Driver p6spy: false # 如果这个库不需要可单独关闭。 order: username: sa password: "" url: jdbc:h2:mem:test driver-class-name: org.h2.Driver ``` #### 修改后的解决方案 为了修正上述问题并成功初始化P6Spy MySQL数据源,应当调整配置文件以匹配实际使用的MySQL环境,并确保所有必要的属性都已正确定义。具体来说,应该更新 `url`, `driver-class-name` 和其他相关选项来适配目标数据库的要求。 以下是针对smart_admin_v3项目的推荐配置方式: ```yaml spring: datasource: hikari: connection-test-query: SELECT 1 dynamic: primary: master strict: false p6spy: true master: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:p6spy:mysql://localhost:3306/smart_admin_v3?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8mb4 username: root password: your_password_here ``` 注意这里做了几个重要的改动: - 使用了更现代的 `com.mysql.cj.jdbc.Driver` 驱动程序替代旧版本[^3]; - 添加了额外的查询参数如 `useSSL=false`, `serverTimezone=UTC` 来提高兼容性和性能; - 设置字符集编码为 `utf8mb4` 支持完整的 Unicode 字符范围; - 明确指定了 HikariCP 作为连接池实现,并启用了测试查询功能以增强稳定性。 通过以上更改,应能有效解决因 JDBC URL 或者驱动加载失败引起的相关异常。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值