Fork me on GitHub

项目数据库优化与代码优化

关于项目优化

最近,项目上线了,然后,一开始比较顺利,前一段时间,由于访问量与数据量激增,导致,tomcat与数据库连接断掉,时常访问不了,因为这个事情,掉了不少的头发,熬了不少的夜,始终查找不到真正的原因,后来经过查看日志,发现,原来,数据库连接池的配置出现了问题,由于连接池,之前使用的是JDBC,现在被我换成了druid,同时对数据库进行优化,慢SQL进行优化,以下为优化的记录。
tomcat优化:其实,这个并未做什么认真的优化,就是将tomcat内存调大,以及配置文件中调整tomcat线程。

1
2
3
4
5
6
7
8
9
<Connector port="80" protocol="HTTP/1.1"
maxThreads="600" // 最大线程
minSpareThreads="100" // 初始化线程
maxSpareThreads="500" // 一旦创建的线程超过这个值,tomcat就会关闭不需要的连接
acceptCount="700" // 如果当前可使用的处理请求的线程被使用时,可以放到处理队列中的请求书,超过这个就不予处理
connectionTimeout="20000"
redirectPort="8443" />
```
**mysql**优化:由于tomcat报错:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure Last packet sent to the server was X ms ago

1
2
3
4
分析:MySQL服务在长时间不连接之后断开了,断开之后的首次请求会抛出这个异常,但是,通过日志以及在实际生产环境中,未发现这个问题,这个问题也记录一下,这个是修改mysql配置文件,my.ini,添加两个属性。
```java
wait_timeout=288000
interactive_timeout=288000

后来在压力测试中发现,不是这个问题,同时报错为数据库连接关闭,无法拿到线程,查看mysql线程数量发现,都被占用中,没有多余的线程了,这样导致了,tomcat无法与数据库连接,时间过长就导致上面的问题出现,真是一坑套一坑啊!后来将两个数值调小,这样,会清空空闲的数据库连接,至少到现在没有任何问题。同时,设置mysql自动重启。清空线程池。

1
2
wait_timeout=2000
interactive_timeout=2000

贴出durid配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
url: ****
driverClassName: com.mysql.jdbc.Driver
username: ****
password: ****
filters: stat,wall
maxActive: 2000
initialSize: 10
#initialSize: 1
maxWait: 60000
minIdle: 10
maxIdle: 15
timeBetweenEvictionRunsMillis: 3000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
maxOpenPreparedStatements: -1
removeAbandoned: true
removeAbandonedTimeout: 7200
logAbandoned: true

同时,发现durid有一个配置比较有意思

1
2
3
4
5
poolPreparedStatements
是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
maxOpenPreparedStatements
要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

这里的建议是mysql关闭,但是,通过查阅发现,如果你的mysql版本为5.5这是可以开启的,据说性能提升巨大,这个我感觉可以测试一下。万一成功了呢!哈哈。

总结:
一、项目中代码存在巨大问题,有些连接以及流没有完全关闭,容易造成内存溢出。
二、对数据库表与表之间的关联性不好,特别是在有大批量数据的时候,这样很容易造成,之前的数据查询是没有问题的,结果数据量一大,就发现出现了非常多的慢sql这些都是需要注意的。
三、一定要对做好压力测试,同时对mysql以及tomcat进行针对性的调优。

—————未经允许,不可转载—————