1

提示:我的托管 tomcat 系统仅提供20 个数据库连接

我在 localhsot 的工作项目

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
          p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
          p:username="${jdbc.username}" p:password="${jdbc.password}" />

这在 localhost 中效果很好,但在生产中它运行了一段时间并且出现异常: “用户已经拥有最大连接数”。

经过多次谷歌

我用c3p0

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" >
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

这在本地主机中有效,但在生产服务器中存在同样的问题

提示:我认为 c3p0 中的一些配置可以解决这个问题。请帮我提出建议(我的主机只提供 20 个连接)

我也试过tomcat

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSourceFactory">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxActive" value="20"/>
    </bean>

上面的 tomcat 代码是错误的,并且不会工作 - 因为错误的属性(我知道)。如何为我的生产使用设置这个(只有 20 个连接)

如果您知道如何使用 tomcat 池,请帮助我们。

我也用过bonecp

<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close" >
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="idleConnectionTestPeriod" value="60"/>
        <property name="idleMaxAge" value="240"/>
        <property name="maxConnectionsPerPartition" value="10"/>
        <property name="minConnectionsPerPartition" value="5"/>
        <property name="partitionCount" value="1"/>
        <property name="acquireIncrement" value="5"/>
        <property name="statementsCacheSize" value="1000"/>
        <property name="releaseHelperThreads" value="3"/>
    </bean>

这在 localhost 中有效,但在生产中同样的问题“用户有很多连接”。

我也试过 apache-dbcp

根据 tomcat 7 文档 - dbcp 不再存在,tomcat 将与 pool 捆绑在一起。即使我使用了 dbcp,我也无法运行我的程序。(我只添加了一个 jar 并且错误是在项目运行期间找不到某些类)

按照我自己的想法:

我认为上面提到的设置会有问题。请帮我提出您的建议。由于重量重,我到现在还没有使用休眠。如果hibernate可以解决这个问题,请告诉我们。


已编辑

目前我正在使用此代码。此代码对我的使用是否正确(20 连接)

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"
      p:driverClass="${jdbc.driverClassName}" p:jdbcUrl="${jdbc.url}"
      p:user="${jdbc.username}" p:password="${jdbc.password}"

      p:acquireIncrement="1" 
      p:checkoutTimeout="1"
      p:idleConnectionTestPeriod="5"           
      p:maxIdleTime="5" 
      p:maxIdleTimeExcessConnections="1" 
      p:maxPoolSize="20" p:maxStatements="0" p:maxStatementsPerConnection="0" 
      p:minPoolSize="1" 
      p:numHelperThreads="100"
      p:overrideDefaultUser="${jdbc.username}" p:overrideDefaultPassword="${jdbc.password}"
      p:propertyCycle="3" 
      p:testConnectionOnCheckin="true"
      p:unreturnedConnectionTimeout="5" />

道代码:

@Repository
public class TutorialsDAOImpl implements TutorialsDAO {
//---
private JdbcTemplate jdbcTemplate;
    private DataSource dataSource;

    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
//---
@Override
    public List<TutorialsCategory_vo> getTutorialsCategory() {
        sql = "SELECT * FROM `tutorials_category` ORDER BY `slug` ASC;";
        List<TutorialsCategory_vo> vo = null;
        try {
            vo = this.jdbcTemplate.query(sql, new Object[]{}, tutorialsCategory_mapper);
        } catch (Exception e) {
            log.log(Level.SEVERE, null, e);
        }
        return vo;
    }

这些是我正在使用的代码。如果有任何错误/更正,请纠正我。


已编辑(针对 Arun P Johny 的问题)

我当前的项目网址

我在上面更新了我当前的代码。


4

1 回答 1

0

这是我最终的 c3p0 设置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"
          p:driverClass="${jdbc.driverClassName}" p:jdbcUrl="${jdbc.url}"
          p:user="${jdbc.username}" p:password="${jdbc.password}"

          p:acquireIncrement="1" 
          p:checkoutTimeout="3000"
          p:idleConnectionTestPeriod="5"           
          p:maxIdleTime="3" 
          p:maxIdleTimeExcessConnections="1" 
          p:maxPoolSize="20" p:maxStatements="20000" p:maxStatementsPerConnection="1000" 
          p:minPoolSize="1" 
          p:numHelperThreads="1000"
          p:overrideDefaultUser="${jdbc.username}" p:overrideDefaultPassword="${jdbc.password}"
          p:propertyCycle="3" 
          p:statementCacheNumDeferredCloseThreads="1"
          p:testConnectionOnCheckin="true"
          p:unreturnedConnectionTimeout="7" />

这工作正常,但需要更多时间(1 或 2 秒 - 不超过 3 秒)。

我还通过关闭 mysql 检查了这段代码。我的程序等到了,我启动了mysql。这很好。此代码等待所有数据库连接完成并正确输出。

我们可以更快地进行此设置吗?提示:我的服务器只提供 20 个连接。

如果您提供正确答案,我会在检查后将其作为正确答案。

于 2013-01-27T14:02:50.790 回答