0%

前言

最近使用mysql数据库导入数据时报错,根据报错的意思是max_allowed_packet设置的太小了,server会拒绝数据入库,下面说一下怎么设置这个值

查看

首先,使用如下命令可以查看当前配置

1
show VARIABLES like '%max_allowed_packet%';
修改

修改有两种方式,一种不需要重启mysql,但是重启失效,一种是修改my.cnf文件,需要重启mysql,但不会失效

  • 修改my.cnf文件,在[mysqld]下加上

    1
    max_allowed_packet=20M

    保存重启mysql。max_allowed_packet = 20M

  • 在命令行或窗口修改

    1
    set global max_allowed_packet = 2*1024*1024*10
重点

命令行修改虽然不用重启mysql,但需要关闭当前连接,重新连接,否则不生效,所以set后如果不关闭连接直接查询,查询的还是之前的值

前言

最近用mysql数据库时,发现一张表查询不了,打不开,想着十有八九肯定时锁表了,下面记录下怎么确定是否锁表和解锁

过程
1
2
3
4
5
//1.查看当前数据库锁表的情况 
SELECT * FROM information_schema.INNODB_TRX;

//2.杀掉查询结果中锁表的trx_mysql_thread_id
kill trx_mysql_thread_id

还有一种查询锁表方法

1
2
3
4
5
6
7
8
9
10
1、查询是否锁表 
show OPEN TABLES where In_use > 0;
2、查询进程
show processlist
查询到相对应的进程 然后 kill id
补充:
查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

前言

项目上有这么一个需求,就是前端上传一个word文档后,需要对其加一个密码,保证安全性,密码入库,当下载人下载后告诉他密码,才能打开,下面记录下实现方案

实现

找了一下,发现了一个spring-doc的第三方工具类,需要引入jar包或导入maven依赖,jar下载连接

阅读全文 »

前言

最近调试项目时改了点东西,突然项目无法启动了,具体报错信息:A compent required a bean of type ‘java.lang.String‘ that could not found,从字面上看是因为没有找到string类型的注入bean

解决

因为改动代码之前没有报错,改动后报的错,那就一定是改动的过程中出现了问题,最重要的是报错没有指明是那行代码或哪个文件报错的错,这是最头疼的问题,我改动的地方有点多,所以我没有还原代码,还是一点一点看改动的代码,最终发现问题所在

1
2
3
    @Resource
// private SystemFileMapper systemFileMapper;
private String key = "LSKDJFLKNBSG*(#@";

这是我改动后报错的代码,发现,我注释的时候没有把上面的注解给注掉,导致注入给下面的string类型的key了

结语

这个也提示我们,如果条件允许,尽量改一个功能就测试一下,是否正常运行,不要一股脑的改完所有的代码再去调试,有准确提示错误的位置还好解决,如果没有提示具体问题,那就需要花很大的代价去找问题

前言

前不久在一个新项目上整合mybatis-plus遇到了一个问题,这个项目之前用的是mybatis,写个简单的crud还得写sql,非常的步方便,还容易出错,有时查询会漏掉参数,或者更新时漏调参数,各种问题,所以把mp集成了一下,我是按照mp官网的快速配置做的,但是配置后启动直接报错Invalid bound statement,下面记录下如果解决这个报错

解决

依赖引入基本上不会有问题,依赖引入一个即可

1
2
3
4
5
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>

但是快速入门却没有指明需要配置以下参数

1
2
mybatis-plus.mapper-locations=classpath:com/dhsr/wx/mapper/xml/*.xml
mybatis-plus.type-aliases-package=com.dhsr.wx.entity

第一行是配置xml的路径,尤其xml不在resource目录下的一定记得要配置,不然找到不到xml,就会报这个错

第二行是指定数据库实体类的存放位置,这个也一定要配置,避免出奇怪的报错

结语

加上这两行后问题解决,mybatis和mp可以共存,共同使用,非常推荐在项目上使用mp,一是crud不容易出错,不会出现漏掉了哪个字段这种问题,二是开发速度快,如果手写sql,你得先在navicat等数据库工具上执行下,看看有没有报错,是否是预期的结果才能运行项目

前言

最近偶尔看到一个没见过的命令jps,全称是Java Virtual Machine Process Status Tool,是java提供的一个显示当前所有java进程pid的命令,适合在linux/unix平台上简单察看当前java进程的一些简单情况,不过实际测试,我在win上也可以用,这个命令还是很有用的,下面介绍下如何使用

使用

jps的实际位置是在在JAVA_HOME/bin/jps,如果你无法使用,则检查下是否配置了JAVA_HOME这个环境变量 ,命令如下

1
2
3
4
5
C:\Users\jin_s>jps -l
1696 org.jetbrains.jps.cmdline.Launcher
8320 org.jetbrains.idea.maven.server.RemoteMavenServer36
1892
748 jdk.jcmd/sun.tools.jps.Jps
阅读全文 »

前言

项目中有个需求,我存了很多类似的key,比如user:1,user:2,user:3…等等这种的,我需要同时把这些user开头的key查出来,实现的方式有两种,有个keys *命令 ,还有个scan命令,下面记录一下这两种方式

KESY 命令

时间复杂度: O(N) , 假设Redis中的键名和给定的模式的长度有限的情况下,N为数据库中key的个数。

Redis Keys 命令用于查找所有符合给定模式 pattern 的 key

阅读全文 »

前言

项目开发过程中遇到一个问题,数据库中其他表都能正常crud,但是其中一个表无法crud,第一感觉就是可能是锁表了,下面记录下如果解决

解决

首先我们要确定下是不是锁表了,使用如下语句可查询当前数据库被锁表的信息

1
2
3
select   request_session_id   锁表进程,OBJECT_NAME(resource_associated_entity_id) 被锁表名
from sys.dm_tran_locks where resource_type='OBJECT';

如果查询出来有数据,那说明被锁表了,使用下面语句进行解锁,其实就是kill掉该进程

1
2
3
4
5
declare @spid  int
Set @spid = 71 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)

第二行的71就是上面查询语句中查询出来的锁表进程,如果有多个,一个个执行下就行

前言

最近用到了多数据源,所以看了一个多数据源的框架,dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。

其支持 Jdk 1.7+, SpringBoot 1.4.x 1.5.x 2.x.x

约定
  1. 本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。
  2. 配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。
  3. 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。
  4. 默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。
  5. 方法上的注解优先于类上注解。
  6. DS支持继承抽象类上的DS,暂不支持继承接口上的DS。
使用方法

1、引入依赖

1
2
3
4
5
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>

2、配置数据源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: ENC(xxxxx) # 内置加密,使用请查看详细文档
username: ENC(xxxxx)
password: ENC(xxxxx)
driver-class-name: com.mysql.jdbc.Driver

#......省略
#以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2
1
2
3
4
5
6
7
8
9
10
# 多主多从                      纯粹多库(记得设置primary)                   混合配置
spring: spring: spring:
datasource: datasource: datasource:
dynamic: dynamic: dynamic:
datasource: datasource: datasource:
master_1: mysql: master:
master_2: oracle: slave_1:
slave_1: sqlserver: slave_2:
slave_2: postgresql: oracle_1:
slave_3: h2: oracle_2:

3、使用 @DS 切换数据源。

@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解

注解 结果
没有@DS 默认数据源
@DS(“dsName”) dsName可以为组名也可以为具体某个库的名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Service
@DS("slave")
public class UserServiceImpl implements UserService {

@Autowired
private JdbcTemplate jdbcTemplate;

public List selectAll() {
return jdbcTemplate.queryForList("select * from user");
}

@Override
@DS("slave_1")
public List selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}

什么是数据源?

可以看到,在java.sql中并没有数据源(Data Source)的概念。这是由于在java.sql中包含的是JDBC内核API,另外还有个javax.sql包,其中包含了JDBC标准的扩展API。而关于数据源(Data Source)的定义,就在javax.sql这个扩展包中。

实际上,在JDBC内核API的实现下,就已经可以实现对数据库的访问了,那么我们为什么还需要数据源呢?主要出于以下几个目的:

  1. 封装关于数据库访问的各种参数,实现统一管理
  2. 通过对数据库的连接池管理,节省开销并提高效率

在Java这个自由开放的生态中,已经有非常多优秀的开源数据源可以供大家选择,比如:DBCP、C3P0、Druid、HikariCP等。

而在Spring Boot 2.x中,对数据源的选择也紧跟潮流,采用了目前性能最佳的HikariCP。接下来,我们就来具体说说,这个Spring Boot中的默认数据源配置。

概述

HikariCP是Spring Framework 5.0的默认数据库连接池,这得益于他的高性能。但是如果配置不当,数据库连接池也可能因影响到系统性能。

阅读全文 »