同步操作将从 Java精选/Ebooks 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
Tomcat可以多个同时启动,但需要修改server.xml配置文件的端口号。
修改%TOMCAT_HOME%\conf下的server.xml配置文件
第一个: 修改http访问端口(默认为8080端口)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
将8080修改为第一个tomcat不在使用的端口号。此处所设的端口号即是访问web时所用的端口号。
第二个: 修改Shutdown端口(默认为8005端口)
<Server port="8005" shutdown="SHUTDOWN">
将8005修改为没有在使用的端口号。
第三个: 修改8009端口
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
将8009修改为没有在使用的端口号。
Spring项目非Spring Boot项目借助Tomcat启动war包来启动项目,通过注解的方式配置定时任务。
1、在spring-mvc.xml的配置文件中添加约束文件:
xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd
2、配置注解驱动
<task:annotation-driven />
3、添加注解的扫描包
<context:component-scan base-package="com.jingxuan" />
4、定时任务代码
package com.jingxuan;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class JingxuanTask {
@Scheduled(cron = "0/5 * * * * ? ") // 间隔5秒执行
public void task() {
System.out.println("----定时任务开始执行-----");
//执行具体业务逻辑----------
System.out.println("----定时任务执行结束-----");
}
}
mysql5.7插入中文字汉字时报java.sql.SQLException: Incorrect string value: '\xE5\xB0'异常。
原因:由于默认情况下,mysql的字符集是latin1(ISO_8859_1),注意此时包含库、表、字段,建表时指定编码格式也会失效。
解决方法
1、查看库、表、表字符字段编码格式
SHOW CREATE DATABASE kepler; //查看库字符集
SHOW CREATE TABLE kepler.statis;//查看表字符集
SHOW FULL COLUMNS FROM kepler.statis; //查看字段编码
2、修改库、表、字符字段编码格式
ALTER DATABASE kepler DEFAULT CHARACTER SET utf8; //修改库字符集
ALTER TABLE kepler.statis CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; //修改表及字符字段字符集
Spring Boot中使用spring-data-redis和jedis操作redis时发现存储在redis中的key不是程序中设置的string值,出现许多类似\xac\xed\x00\x05t\x00这种字符串。
原因:spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化。
public void afterPropertiesSet() {
super.afterPropertiesSet();
boolean defaultUsed = false;
if (defaultSerializer == null) {
defaultSerializer = new JdkSerializationRedisSerializer(
classLoader != null ? classLoader : this.getClass().getClassLoader());
}
if (enableDefaultSerializer) {
if (keySerializer == null) {
keySerializer = defaultSerializer;
defaultUsed = true;
}
if (valueSerializer == null) {
valueSerializer = defaultSerializer;
defaultUsed = true;
}
if (hashKeySerializer == null) {
hashKeySerializer = defaultSerializer;
defaultUsed = true;
}
if (hashValueSerializer == null) {
hashValueSerializer = defaultSerializer;
defaultUsed = true;
}
}
if (enableDefaultSerializer && defaultUsed) {
Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized");
}
if (scriptExecutor == null) {
this.scriptExecutor = new DefaultScriptExecutor<K>(this);
}
initialized = true;
}
解决办法: StringRedisSerializer是RedisSerializer的实现类,把KeySerializer和ValueSerializer设置为StringRedisSerializer。将redisTemplate默认改为StringRedisSerializer序列化方式。
public class RedisServiceImpl {
private static final Logger log = LoggerFactory.getLogger(RedisDao.class);
private RedisTemplate redisTemplate;
private RedisTemplate<String, Object> redisTemplateMap;
@Autowired(required = false)
public void setRedisTemplate(RedisTemplate redisTemplate) {
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
this.redisTemplate = redisTemplate;
}
}
产生原因
Linux系统中too many open files异常是比较常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等,所以有时又称为句柄(handle),这个错误通常可以叫做句柄数超出系统限制。例如如下错误信息:
Caused by: java.io.FileNotFoundException: /home/tomcat/jingxuan-tomcat/webapps/jingXuanAPI/WEB-INF/lib/activemq-client-5.9.1.jar (Too many open files)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:225)
at java.util.zip.ZipFile.<init>(ZipFile.java:155)
原因分析
进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数,通过命令ulimit -a可以查看当前系统设置的最大句柄数是多少。
[root@mrwang ~]# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14429
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14429
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
其中“open files”参数表示系统目前允许单个进程打开的最大句柄数,这里是65535,该服务器已经调整过了,默认是1024。
使用命令“lsof -p 进程id”可以查看单个进程所有打开的文件详情,使用命令“lsof -p 进程id | wc -l”可以统计进程打开了多少文件。
如果文件数过多使用“lsof -p 进程id”命令无法完全查看的话,可以使用“lsof -p 进程id > openfiles.log”将执行结果内容输出到日志文件中查看。
[root@mrwang ~]# lsof -p 8288
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 8288 root cwd DIR 253,1 160 1717293 /home/tomcat/apache-tomcat-server
java 8288 root rtd DIR 253,1 244 128 /
java 8288 root txt REG 253,1 8712 1507063 /home/jdk/jdk1.8.0_291/bin/java
java 8288 root mem REG 253,1 168368 33739024 /usr/lib64/libresolv-2.28.so
java 8288 root mem REG 253,1 41304 33739018 /usr/lib64/libnss_dns-2.28.so
java 8288 root mem REG 253,1 3559360 67178238 /home/jdk/jdk1.8.0_291/jre/lib/resources.jar
java 8288 root mem REG 253,1 104256 34147343 /usr/lib64/libgcc_s-8-20190507.so.1
java 8288 root mem REG 253,1 283368 84407379 /home/jdk/jdk1.8.0_291/jre/lib/amd64/libsunec.so
java 8288 root mem REG 253,1 113008 84407389 /home/jdk/jdk1.8.0_291/jre/lib/amd64/libnet.so
java 8288 root mem REG 253,1 93872 84407404 /home/jdk/jdk1.8.0_291/jre/lib/amd64/libnio.so
...
解决方法
方式一:命令方式
ulimit -n 2048
命令的意思是把当前用户的最大允许打开文件数量设置为2048,注意这种设置方法在重启后会还原为默认值。
ulimit -n命令非root用户只能设置到4096,如果想要设置到更大需要sudo权限或者root用户。
方式二:修改系统配置文件
[root@mrwang ~]# vim /etc/security/limits.conf
在文件末尾处增加如下内容:
* soft nofile 4096
* hard nofile 4096
或者
* - nofile 8192
*表示所有用户,可根据需要设置某一用户,例如:
jingxuan soft nofile 8192
jingxuan hard nofile 8192
注意的是“nofile”项有两个可能的限制措施,分别是hard和soft。要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用”-“字符设定, 则hard和soft设定会同时被设定。
1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)。
2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合。
3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度。
4、针对数量大的表进行历史表分离(如交易流水表)。
5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步。
6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等。
7、查看mysql执行日志,看看是否有其他方面的问题。
1)检查连接的注册中心是否正确。
2)到注册中心查看相应的服务提供者是否存在。
3)检查服务提供者是否正常运行。
在html中form表单不可以嵌套使用,例如:
<form name="form1">
<form name="form2">
......
</form>
.....
</form>
这样不符合规范,如果需要用到两个表单的情况下,可以考虑合并两个表单,动态改变表单提交位置。
form表单中action为空,在js代码中改变action的值,也就是提交路径。
<form id="formId" action="" method="post">
.....
<button id="button1" type="submit"></button>
<button id="button2" type="submit"></button>
</form>
<script>
$(document).ready(function(){
$("#button1").click(function(){
$("#formId").attr("action","url地址1");
$("form").submit();
});
$("#button2").click(function(){
$("#formId").attr("action","url地址2");
$("form").submit();
});
}
</script>
注意提交按钮button的类型是submit不是button。
Java中UUID依赖于SecureRandom.nextBytes方法,而SecureRandom又依赖于操作系统提供的随机数源。在Linux系统下,它的默认依赖是/dev/random,而这个源是阻塞的。
主要原因是nextBytes方法是一个被synchronized关键字修饰的方法,也就是说如果多线程调用UUID,生成速率不升反降,解决这个问题需要修改java的默认随机生成规则就可以。
打开$JAVA_PATH/jre/lib/security/java.security文件,找到下面的内容:
securerandom.source=file:/dev/random
替换成
securerandom.source=file:/dev/./urandom
Spring Boot项目中集成了thymeleaf模版引擎本地正常运行没任何问题,但是放到Linux系统后出现访问页面报500的问题。
分析原因:可能是thymeleaf模板引擎解析找不到模板路径导致的问题。
例如controller层返回url中出现有大写,文件名config.html,路径写成了device/Config,在window下启动项目时可能可以正常访问页面,但是在Linux系统时必须与文件名一致,还有就是前面不要加/,否则也会报500的问题。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。