show profile功能
开启 Show Profile 功能,默认该功能是关闭的,使用前需开启。show variables like 'profiling'; set profiling = on; ## 执行一部分sql后(默认保留15条) show profiles; ## duration是持续时间 ## 针对特定的sql进行诊断 show profile cpu,block io for query Query_ID;/*Query_ID为#3步骤中show profiles列表中的Query_ID*/
show profile 的常用查询参数。
①ALL:显示所有的开销信息。
②BLOCK IO:显示块 IO 开销。
③CONTEXT SWITCHES:上下文切换开销。
④CPU:显示 CPU 开销信息。
⑤IPC:显示发送和接收开销信息。
⑥MEMORY:显示内存开销信息。
⑦PAGE FAULTS:显示页面错误开销信息。
⑧SOURCE:显示和 Source_function,Source_file,Source_line 相关的开销信息。
⑨SWAPS:显示 ...
查询时别名
在 mysql 中
group by ,having ,order by 支持字段的别名。group by ,order by 后使用别名select case when t.author_level in(1,2) then '1-2级' when t.author_level in(3,4) then '3-4级' when t.author_level in(5,6) then '5-6级' else '' end as level_cnt, count(s.issue_id) as numfrom author_tb t join answer_tb s on t.author_id = s.author_idwhere s.char_len >= 100group by level_cntorder by num desc
where 后面不支持字段的别名。
如果关联查询的时候给表起了别名。那么 where 后面如果 ...
比较date或者datetime
单个的比较可以直接使用> < 或者= 来比较,但是当两个值的组合与另两个值的组合进行比较的时候,可以使用UNIX_TIMESTAMP()函数
SELECT *FROM dtjc_jh_jdjhWHERE xm_id = #{xmId}ORDER BY (UNIX_TIMESTAMP( start_time ) + UNIX_TIMESTAMP( end_time ))/ 2;
如上就是根据起始时间和终止时间的中间值进行比较。其中 start_time 和 end_time 都是 datetime 类型
锁
myisam 的读写锁(表锁)lock table emp read;lock table emp write;
myisam 是写锁调度优于读锁调度,所以 mysiam 要偏读(因为写会阻塞其他线程对当前表的任何操作)
myisam 执行 select 时会给所有涉及的表增加读锁。执行增删改时会给所有涉及到的表增加写锁
表读锁,当前 session 只能读当前表,对其他表任何操作都做不了,其他 session 能做任何操作,只是对有读锁的表的增删改会阻塞
表写锁,当前 session 只能对当前表做增删改查,对其他表任何操作都做不了,其他 session 对有写锁的表的任何操作都会堵塞,但是对其他的表可以做任何操作
show open tables; --查看哪些表被锁了show status like 'table%'; --分析表的锁定状况
innodb 的读写锁(行锁)session1 更新某一行时,且未提交。session2 读到的是旧数据。直到 ession1 提交。session2 才能读到新数据
session1 更新某一行时,且未提交。当 ses ...
time和update_time的策略
二者默认值都设置为 CURRENT_TIMESTAMP(DEFAULT CURRENT_TIMESTAMP),保证插入时记录时间
update_time 勾选上根据当前时间戳更新(ON UPDATE CURRENT_TIMESTAMP),保证更新时记录时间
参考 sql
CREATE TABLE `mytest` ( `text` varchar(255) DEFAULT '' COMMENT '内容', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间') ENGINE=InnoDB DEFAULT CHARSET=utf8;
注意:采用数据库层面的策略不支持切换数据库,如果想要开发的应用兼 ...
索引
什么情况下要用索引
主键自带主键索引
唯一约束自带唯一索引
外键自带外键索引
查询条件用到的字段需要
排序用的的字段
分组用到的字段
什么情况下不能用索引
数据量较少时不用建索引。
频繁更新字段不能建索引
索引的选择性(字段的值尽量复杂且尽量分布不平均)
where 条件查询用不到的字段不用建索引
mysql 优化索引十诫(附口诀)
全值匹配我最爱
最佳左前缀法则(如果索引引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列)
不在索引列上做任何操作(计算,函数,(自动 or 手动)类型转换),会导致索引失效而转向全表扫描
存储引擎不能使用索引中范围条件右边的列
尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少 select *
mysql 在使用!=或者<>时候无法使用索引而转向全表扫描
is null,is not null 也无法使用索引
like 以通配符开头(‘%abc’)mysql 索引失效会变成全表扫描的操作。解决办法:使用覆盖索引
字符串不加单引号导致索引失效
少用 or,用 or 连接时会索引失 ...
主从复制的搭建
#
做主从的前提
两台服务器的防火墙都开放了各自 mysql 的服务端口(下面以默认的 3306 为例子)
从库无法同步主库之前的数据。如果主库之前有数据,那么先把主库的数据导入到从库中。保证两台服务器在做主从复制之前的数据一致性
尽量保证两台服务器的 my.cnf 文件只有 server-id 不同。其他的配置都相同
修改主服务器的配置
vi /etc/my.cnf
[mysqld]# 启用主从配置(主服务器)# 主服务器idserver-id=1# 二进制日志log-bin=mysqlbin# 设置忽略复制的数据库# binlog-ignore-db=mysql# 设置需要复制的数据库# binlog-do-db=dtjc
重启 mysql 服务器
service mysqld restart
mysqld 无效的话把 mysqld 换成 mysql
运行
mysql> show master status;+-----------------+----------+--------------+------------------+---------------- ...
node的环境安装
nvm建议先安装 nvm,而不是直接安装 node
nvm 是什么nvm 全英文也叫 node.js version management,是一个 nodejs 的版本管理工具,为了解决 node.js 各种版本存在不兼容现象可以通过它可以安装和切换不同版本的 node.js。可在点此在上下载最新版本
nvm 命令提示
nvm arch:显示 node 是运行在 32 位还是 64 位。
nvm install <version> [arch] :安装 node, version 是特定版本也可以是最新稳定版本 latest。可选参数 arch 指定安装 32 位还是 64 位版本,默认是系统位数。可以添加—insecure 绕过远程服务器的 SSL。
nvm list [available] :显示已安装的列表。可选参数 available,显示可安装的所有版本。list 可简化为 ls。
nvm on :开启 node.js 版本管理。
nvm off :关闭 node.js 版本管理。
nvm proxy [url] :设置下载代理。不加可选参数 url,显示当前代理 ...
自适应宽度的input框
解决办法 1:div 的 contenteditable=”true”属性。能实现一行编辑。待解决的问题:需要禁止回车换行,同时还有编辑完之后光标不会回到最开始,光标会保留在你最后编辑的地方
<div class="dict_val1" contenteditable="true" id="lineLength"></div>
div[contenteditable] { height: 0.1458rem; line-height: 0.1458rem; /*重要*/ width: auto; min-width: 0.1458rem; white-space: nowrap; overflow: hidden; outline: none; /*重要*/ color: #001631; padding: 0 0.0677rem;}
开启编辑状态的话只需把 outline 的 none 去掉就行,改为默认状态或自定义属性如 outline:#00FF00 do ...
容器滚动条出现的条件
容器出现滚动条的条件:1,容器有固定的高度,2,容器的内容高度,超出了容器的高度,如果容器未设定高度,则它会向父亲,祖先找到有高度的容器,并在其身上显示滚动条
向静态类注入bean
方式1@Componentpublic class DtjcProjectGeneralReportUtil { @Autowired private IDataAnalysisService dataAnalysisService; private static IDataAnalysisService staticDataAnalysisService; @PostConstruct public void init() { staticDataAnalysisService = dataAnalysisService; } // 这里是静态方法,该方法请调用静态bean public static String getDtcjGeneralReportTestTaskId(String projectId) { String TestTaskId = ""; TestTaskId = staticDataAnalysisServic ...
windows根据端口杀进程
以 8088 端口为例:
netstat -aon|findstr "8088"
最后一列是 pid。假设为 5544
taskkill /pid 5544 -t -f
openFeign的全方位简单讲解
OpenFeign 全方位讲解_Young 丶的博客-CSDN 博客_openfeign
事务的传播行为以及在spring中的配置
一、什么是事务传播行为?事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何运行。
例如:methodA 方法调用 methodB 方法时,methodB 是继续在调用者 methodA 的事务中运行呢,还是为自己开启一个新事务运行,这就是由 methodB 的事务传播行为决定的。
二、事务的 7 种传播行为Spring 在 TransactionDefinition 接口中规定了 7 种类型的事务传播行为。事务传播行为是 Spring 框架独有的事务增强特性。7 种:(required / supports / mandatory / requires_new / not supported / never / nested)
PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,这是最常见的选择,也是 Spring 默认的事务传播行为。(required 需要,没有新建,有加入)
PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务, ...
使用poi导出带有数据的模版
@Overridepublic void downloadLjcjImportTemplate(String xianbie, String xingbie, HttpServletResponse response) { // 设置返回头 response.setHeader( "Content-disposition", "attachment;filename=" + new String(("路基u型槽沉降模版.xlsx").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); // 从库里查询数据 QueryWrapper<TTzCjDmjcd> qw = new QueryWrapper<>(); qw.eq("xianbie", xianbie); qw.eq("xingbie", xingbie); qw.eq("jcd_ ...
使用java代码控制事务
代码中控制事务的三种方式
编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚。优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了。
声明式事务:就是使用 SpringAop 配置事务,这种方式大大的简化了编码。需要注意的是切入点表达式一定要写正确。
注解事务:直接在 Service 层的方法上面加上@Transactional 注解,个人比较喜欢用这种方式。
事务回滚的原因
在工作中,看过别人写的代码出现了事务不回滚的现象。当然,事务不回滚的都是采用的声明式事务或者是注解事务;编程式事务都是自己写代码手动回滚的,因此是不会出现不回滚的现象。
再说下声明式事务和注解事务回滚的原理:当被切面切中或者是加了注解的方法中抛出了 RuntimeException 异常时,Spring 会进行事务回滚。默认情况下是捕获到方法的 RuntimeException 异常,也就是说抛出只要属于运行时的异常(即 RuntimeException 及其子类)都能回滚;但当抛出一个不属于运行时异常时,事务是不会回滚的。
下面说说我经常见到的 3 种事务不回滚的产生原因:
(1)声明式 ...
整合druid不支持批量更新的问题
轻骑兵的解决方式
注意 url 后面多了个 allowMultiQueries=true
spring: ################### mysql配置 ################### datasource: url: jdbc:mysql://123.123.122.138:3310/dtjc_sbgl_dev?autoReconnect=true&rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2b8&allowMultiQueries=true username: root password: 123456a? db-name: dtjc_sbgl_dev filters: log4j,mergeStat driverClassName: com ...
检查文件是否存在
/** * 下载文件,传入完成路径,先检查文件是否存在,如果存在就下载 * @param path */downloadFileWithPath = function (path) { $.ajax({ url: Hussar.ctxPath + '/checkFileExist', type: 'get', async: true, data: { path }, success(res) { if (res.code === 500) { Hussar.valid(res.msg) return } // 如果文件存在,那么就下载文件 window.location.href = '/downLoadFile?path=' + path }, error() { Hussar.valid(' ...
动态加载服务器上的图片
<img src="/loadImg?path='xxx'" />
/** * IO流读取存在服务器上的图片 * * @return * @throws IOException */@RequestMapping(value = "/loadImg", method = RequestMethod.GET)public void loadImg(@RequestParam("path") String path, HttpServletResponse response) throws IOException { //这里省略掉通过id去读取图片的步骤。 File file = new File(path);//imgPath为服务器图片地址 if (file.exists() && file.isFile()) { FileInputStream in = null; Ou ...
获取相对路径下的配置文件信息
路径位置如下
配置文件信息
ureport.disableFileProvider=falseureport.debug=trueureport.disableHttpSessionReportCache=falseureport.fileStoreDir=D:/hussar/hussar_v8/hussar-web/src/main/resources/ureportfiles/odmsfilePath = D:/DevelopKit/FILEopenOfficePath = D:/Program Files (x86)/OpenOffice 4/program/soffice.exe -headless -accept="socket,host=127.0.0.1,port=8100;urp;"pdfPath = D:/PDF/fpPath = D:/fenpianpythonPath = D:/pythoncode/dataReaderName = DWDataReaderLib64.dll
代码示例
package com.jxdinfo.hussar.ut ...