2013-01-24 26 views
1

提示的方式:我的托管Tomcat的系统只提供分贝连接最佳春数据库池生产系统

我的工作项目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}" /> 

这个工作在本地主机好,但在生产中它会运行一段时间,并且例外情况:“用户已经完全没有连接”。

后许多谷歌

我用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> 

这个工作在本地主机,但同样的问题,在生产的“用户具有许多连接”。

我也试过Apache的DBCP

按照Tomcat的7文档 - DBCP不再和Tomcat将与池捆绑在一起。即使我使用dbcp,但我无法运行我的程序。 (我只加一个罐子和错误是一些类项目运行期间未找到)

按我自己的想法:

我认为上述的设置会有任何问题。请帮我提一下你的建议。由于体重过重,我现在不使用休眠功能。如果hibernate能解决这个问题,请告诉我们。


EDITED

目前我使用这个代码。这是正确的代码我使用(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" /> 

DAO代码:

@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; 
    } 

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


编辑(对于阿伦P佐尼的问题)

我的当前项目url

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


+0

我可以在生产系统中使用javadb(或类似的东西)吗?这会解决我的问题吗? –

+1

并发用户的预期数量是多少?一个包含20个连接的池应该足够用于小应用程序。你确定连接管理没有资源泄漏吗? –

+0

**预期用户数量:** [它是一个动态网站。](http://featuriz.com/) **资源泄漏:**请检查我更新的(当前使用的)代码。没有泄漏 –

回答

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 secounds - 不超过3 secounds)。

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

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

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