[英]Spring and MySQL connections (keeps creating new connections instead using sleeping connections)
I don't know why each time someone visits a page on my website, a new connection is open to the database. 我不知道为什么每次有人访问我网站上的页面时,数据库都会打开一个新连接。 Eventually I reach like 300 and get an error and pages no longer load.
最终,我达到了300,并得到一个错误,页面不再加载。 I thought the way it should work is, I Have maxIdle set for 30, so that means I should not have more than 30 sleeping connections open by Spring.
我以为它应该工作的方式是,我将maxIdle设置为30,所以这意味着到Spring时我打开的睡眠连接不应超过30。 But at this moment I have 88 open.
但是目前我有88个空缺。 If I close down or reboot my server it will go back down to near 0. I use getJdbcTemplate() for every query.
如果我关闭或重新启动服务器,它将回落到0附近。我对每个查询都使用getJdbcTemplate()。
Here is part of my spring-config.xml 这是我的spring-config.xml的一部分
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="XXXXXXXXX" />
<property name="username" value="XXXXXXXXXX" />
<property name="password" value="XXXXXXXX" />
<property name="maxIdle" value="30"/>
<property name="defaultAutoCommit" value="true"/>
</bean>
Here is what part the dao looks like (renamed) 这是dao的外观(重命名)
@Repository
public class ExampleDAOImpl extends JdbcDaoSupport implements ExampleDAO {
@Autowired
public ExampleDAOImpl(DataSource dataSource) {
setDataSource(dataSource);
}
Here is what I get from show processlist in MySQL (not display all rows here, there were 88) 这是我从MySQL的show processlist中获得的信息(此处未显示所有行,共有88行)
+----------+------------+-------------------------------------------+------+---------+-------+----------------+---------------------
| Id | User | Host | db | Command | Time | State | Info db
+----------+------------+-------------------------------------------+------+---------+-------+----------------+-----------------------
| 21721763 | user | XXXXXXXX:60586 | db | Sleep | 10609 | | NULL db
| 21924432 | user | XXXXXXXX:59498 | db | Query | 0 | NULL | show processlist db
| 21924580 | user | XXXXXXXX:59702 | db | Sleep | 790 | | NULL db
| 21924722 | user | XXXXXXXX:60010 | db | Sleep | 790 | | NULL db
| 21924813 | user | XXXXXXXX:60131 | db | Sleep | 787 | | NULL db
| 21924819 | user | XXXXXXXX:60139 | db | Sleep | 786 | | NULL db
| 21924841 | user | XXXXXXXX:60156 | db | Sleep | 785 | | NULL db
| 21927089 | user | XXXXXXXX:56292 | db | Query | 1 | Opening tables | XXXXXXXX |
| 21927090 | user | XXXXXXXX:56295 | db | Query | 1 | Opening tables | XXXXXXXX |
88 rows in set (0.01 sec)
Example dao method 道方法示例
public String selectSomething(String text) throws IllegalArgumentException, DAOException {
return (String) getJdbcTemplate().queryForObject(SELECT_QUERY_1, new Object[] {text}, String.class);
}
Try this configuration, which is the result of many tweaks for a PROD environment: 尝试此配置,这是对PROD环境进行许多调整的结果:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver">
<property name="url" value="XXX" />
<property name="username" value="XXX"/>
<property name="password" value="XXX"/>
<property name="minIdle" value="0"/>
<property name="maxIdle" value="10"/>
<property name="maxActive" value="50"/>
<property name="maxWait" value="60000"/>
<property name="testOnBorrow" value="true"/>
<property name="validationQuery" value="SELECT 1"/>
<property name="timeBetweenEvictionRunsMillis" value="1800000"/>
<property name="numTestsPerEvictionRun" value="50"/>
<property name="minEvictableIdleTimeMillis" value="10"/>
<property name="testWhileIdle" value="true"/>
</bean>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.