一直在处理一个基于战争的应用程序,该应用基本上是一个旧的API API组成:
- Java 1.7
- 弹簧4.0.3.Release
- tomcat 7
- mysql 5
我们使用的是Spring JDBC,而不是通过尝试/捕获/最终语句结束任何连接。
我们的数据源配置文件看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="propertyPlaceholder"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="location" value="file:/opt/db/database.properties"></property>
</bean>
<!-- Initialization for data source dbcp -->
<bean id="dataSourceStore" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"><value>${db.driver}</value></property>
<property name="url"><value>${db.mydb.url}</value></property>
<property name="username"><value>${db.username}</value></property>
<property name="password"><value>${db.password}</value></property>
<property name="maxIdle" value="10" />
<property name="maxActive" value="50" />
<property name="maxWait" value="100" />
<property name="defaultAutoCommit" value="false" />
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="1" />
<property name="minIdle" value="0"></property>
<property name="timeBetweenEvictionRunsMillis" value="1000"></property>
<property name="minEvictableIdleTimeMillis" value="1000"></property>
</bean>
</beans>
我们这样导入我们的配置:
@Repository
public class StoreDAO {
String errorCode = "";
private JdbcTemplate jdbcTemplate;
@Autowired
public StoreDAO(@Qualifier("dataSourceStore") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// methods which use Spring JDBC calls (such as SQL Select Statements)
}
在群集的Production tomcat7服务器中运行此程序时,我们会得到以下例外(在四个不同的daos中,整个位置):
DAO::org.springframework.jdbc.CannotGetJdbcConnectionException:
Could not get JDBC Connection; nested exception is
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
Data source rejected establishment of connection,
message from server: "Too many connections"
问题:
如何将现有代码(将本地Spring XML DataSource文件)更改为可以实现JDBC连接池的方式?
我是否应该在每个成功的sql select call?
之后关闭try/catch/the catch/lie子句中的结果序列。
,例如
finally {
if (stat != null) stat.close();
if (conn != null) conn.close();
}
我还应该通过编辑my.cnf文件来增加MySQL数据库中最大连接的数量(增加最大连接数的含义是什么?):
https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_max_connections
在Spring DataSource.xml文件中,我可以简单地增加以下属性内的值吗?
&lt;属性名称=" maxidle" value =" 10"/>
&lt;属性名称=" maxActive" value =" 50"/>
&lt;属性名称=" maxwait" value =" 100"/>
是否可以提供一些方向,因为这是一个传统应用程序,因为与MySQL数据库的"连接太多",这是一个严重的性能问题。
如何将现有代码(将本地Spring XML DataSource文件)更改为可以实现JDBC连接池的方式?
您是已经使用连接池。Apachedbcp(数据库连接池)是一个连接池。
我是否应该在每个成功的sql select call?
之后关闭try/catch/the try catch/fine子句中的结果定期?
这就是JDBCtemplate的全部内容。您没有使用它显示任何JDBC代码,但是此类的全部要点是为您处理JDBC资源的关闭。因此,除非您以一种非常奇怪的方式使用它,否则资源将被关闭。
我还应该通过编辑my.cnf文件来增加MySQL数据库中最大连接的数量(增加最大连接数的含义是什么?)
我们无法回答这一点,因为我们不知道当前数字是什么,您的应用程序中有多少个实例使用数据库以及您可能需要多少其他连接(本应用程序不使用,但对于其他申请或管理目的)。您的连接池最多可以打开与此数据库的50个活动连接,因此,假设您拥有该应用程序的一个实例,则应该在数据库中允许至少50个连接,这是与此数据库打开连接的唯一一件事。
在spring datasource.xml文件中,我可以简单地增加以下属性中的值吗?
给出了您得到的例外(但您没有发布其堆栈跟踪,因此很难确切知道发生了什么),这只会使情况变得更糟:数据库已经重新填充可以打开连接,这会告诉池池尝试打开更多。如果有的话,您应该降低最大活动连接的数量。