WHH

MY BLOG

最近有一条sql因为jar依赖的问题导致异常,以前旧版本是正常的,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- 建表
create table fresh_product(
id bigint auto_increment primary key ,
activity_id bigint not null default 0,
product_id varchar(20) not null default ''
);

-- 查询每个activity_id前4条
set @lineNum = 0, @activityId = 0;
select activity_id activityId, goodsNo
from (select activity_id,CONVERT(product_id,SIGNED) goodsNo,
@lineNum := IF(@activityId = activity_id, @lineNum + 1, 1) as lineNum,
@activityId := activity_id t
from fresh_product where activity_id in
(10000745,10000738, 10000732)
order by activity_id asc,goodsNo desc) tmp
where tmp.lineNum <= 4;

现在需要改造该sql,改造如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
select SUBSTRING_INDEX(SUBSTRING_INDEX(t.product_ids, ',', nums.n), ',', -1) id,t.activity_id
from (select 1 n
union all
select 2
union all
select 3
union all
select 4) nums
inner join
(select substring_index(group_concat(product_id order by product_id desc), ',', 400) product_ids, activity_id
from fresh_product where activity_id in (10000745,10000738, 10000732)
group by activity_id) t on CHAR_LENGTH(t.product_ids)
- CHAR_LENGTH(REPLACE(t.product_ids, ',', '')) >= nums.n - 1

新sql看起来更复杂了,先是group by后group_concat数据,然后把逗号分割的列转换为行。
这种处理方法有一点问题是,group_concat如果太长会截取一部分。如果取的前几个较多,会取不到数据,截取长度可配置。

一次项目依赖版本变动,导致mybatis返回的字段变为空值。
查询sql如下:

1
2
3
4
5
6
7
8
<select id="findFreshActivity" parameterType="int" resultMap="freshActivity">
select id,
activity_name activityName
from fresh_activity
<where>
id = #{0}
</where>
</select>

映射如下:

1
2
3
4
<resultMap id="freshActivity" type="com.feiniu.common.po.FreshActivity">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="activity_name" property="activityName" jdbcType="VARCHAR"/>
</resultMap>

发现返回的对象里面id有值,activityName为null。

阅读全文 »

父类想获取子类上的泛型,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class AbsFileHandle<T> {
public void start(String filepath){
//文件转对象
//preview(t);
}
protected abstract void preview(T t);
}

public class File1Handle extends AbsFileHandle<DemoFile1>{
@Override
protected void preview(DemoFile1 demoFile1) {

}
}

public class DemoFile1 {
}

解决办法有多种:

  • 写个抽象方法,返回具体类型
  • 写个构造方法,参数是具体类型
  • 通过反射获取
    阅读全文 »

有个项目最开始gradle,打算边写边学习,最近不知道为什么一直编译失败,一直没找到原因。索性又改为maven了,在改的时候springboot采用的是3.1.5,里面的spring版本是6.0。在改为maven时顺手改为3.2.1,之后调用接口一直失败。提示

1
2
exception Name for argument of type [java.lang.Integer] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the
'-parameters' flag.

其实在spring wiki里面有写,升级注意事项,之前没看见,后面才注意,因为LocalVariableTableParameterNameDiscoverer在spring6.1里面已经删除。

Upgrading-to-Spring-Framework-6.x
Spring-Boot-3.2-Release-Notes

以前LocalVariableTableParameterNameDiscoverer是会读取解析对象class文件后通过LocalVariableTable拿到参数名称。

阅读全文 »

为了兼容老旧电脑,公司前端统一使用的vue2,项目种采用scss的老旧版本,导致当前win10版本需要python2来编译,本地电脑有一堆python3和node18项目,不想破环当前项目环境,所有打算通过docker启动。

docker容器镜像采用的是node:14.14-alpine3.10,在Alpine’s Python 2 Package is Deprecated 有说明alpine 3.12已经不使用python2了,所以直接使用3.10版本。

阅读全文 »

上次发现因为数据库获取新的连接超时,其实是对数据做存在更新不存在做插入。想到对于更新不同数据速度相差多少。

暂时有4种更新方法。
一个个更新

1
2
update simple set code=#{item.code}
where id = #{item.id}

采用batch批量更新,sql如上,只是批量提交请求。
拼装更新sql为一个大的sql

1
2
3
4
<foreach collection="datas" item="item" separator=";">
update simple set code=#{item.code}
where id = #{item.id}
</foreach>

对于mysql,需要添加allowMultiQueries=true参数

采用临时表关联更新

1
2
3
4
5
6
7
8
update simple t,
(
<foreach collection="datas" item="item" separator=" UNION ALL ">
select #{item.id} as id, #{item.code} as code
</foreach>
) v
set t.code = v.code
where t.id = v.id
阅读全文 »

初步分析

最近一个应用一直提示获取连接超时,找运维dump内存后分析原因。
在开始前就猜到了大概率是因为某个sql超长时间执行导致连接不释放,导致连接池占用满了。

项目使用的tomcat-jdbc连接池。
直接查oql

1
select t from org.apache.tomcat.jdbc.pool.PooledConnection t
阅读全文 »

最近使用一个springboot项目采用默认的jackson序列化,配置参数如下

1
2
3
spring.jackson.default-property-inclusion=non_null
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.deserialization.read-unknown-enum-values-as-null=true

设置好后发现返回的Date类型,数据库时间是2023-11-06 16:24:40返回的时间是2023-11-06 08:24:40,时间少了8小时。
最开始以为是数据库采用PostgreSQL导致数据存储的时间有问题,查看数据库后数据正常。对数据进行debug后,找到是因为jackson对时间格式化时,采用的时区有误。

阅读全文 »

跨域问题解决有多种,一般直接在服务端配置运行跨域即可。

项目以前是普通的Spring项目,通过Tomcat启动,之后改为springboot。
正常应该是配置filter运行跨域即可。再项目上线后发现跨域不生效,经过排查后发现项目改造不完整

  1. 本地开发是通过main方法启动,但是发布的服务器上是打包为war后启动
  2. 保留了web.xml文件,跨域配置在spring容器中不生效。

解决办法就是把filter改到web.xml即可。

阅读全文 »
0%