2015-12-22 52 views
2

我使用树脂服务器+弹簧框架和C3P0连接池。我已经使用以下属性文件配置了连接池。但不知何故每24小时左右我的网站面临连接超时错误,然后我必须重新启动我的树脂服务器,使网站再次生活。请告诉我什么是错误的以下配置文件和什么即时消息在这里丢失。C3P0连接池给出连接超时错误具有这种配置

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.databaseURL=jdbc:mysql://localhost/my_database1_url 
jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url 
jdbc.username=my_username 
jdbc.password=my_password 
jdbc.acquireIncrement=10 
jdbc.minPoolSize=20 
jdbc.maxPoolSize=30 
jdbc.maxStockPoolSize=30 
jdbc.maxStatements=100 
jdbc.numOfHelperThreads=6 
jdbc.testConnectionOnCheckout=true 
jdbc.testConnectionOnCheckin=true 
jdbc.idleConnectionTestPeriod=30 
jdbc.prefferedTestQuery=select curdate(); 
jdbc.maxIdleTime=7200 
jdbc.maxIdleTimeExcessConnections=5 
+0

连接超时的一个原因可能是所有连接都耗尽。如果我说你的应用程序中可能存在连接泄漏,你会同意吗?如果是,请尝试识别并修复它们。使用c3p0池可以轻松识别泄漏。 – Yasin

+0

是的。有连接泄漏,但我不知道如何导致超时错误。 – user2522497

+0

我有一个类似的问题,但与不同的数据库服务器。 'http:// stackoverflow.com/questions/26864383/mysql-hibernate-connection-issue-while-using-c3p0'。尝试启用c3p0的日志并检查发生了什么。 –

回答

3

于是,一堆东西。

  • c3p0内置了用于观察和调试连接泄漏的工具。请设置配置参数 unusedConnectionTimeout unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTraces。设置一个unreturnedConnectionTimeout,它定义了一段时间后,c3p0应该假定Connection已经泄漏,然后关闭它。设置debugUnreturnedConnectionStackTraces以要求c3p0记录检出没有正确检入的连接的堆栈跟踪。请参阅Configuring to Debug and Workaround Broken Client Applications
  • 您正在以非标准方式配置c3p0。这可能是好的,或者没有,但你想验证你打算设置的配置是配置c3p0获得。 c3p0 DataSources在INFO池初始化时转储它们的配置。 请考虑检查以确保您获得您想要的配置。或者,您可以通过JMX检查您的DataSource的运行时配置。
  • 除了配置的非标准手段,几个配置属性似乎不妥。 prefferedTestQuery应该是preferredTestQuerynumOfHelperThreads应该是numHelperThreads
  • 以下是不C3P0配置名称都没有。也许你在内部将它们映射到c3p0配置,但是你想验证这一点。这里是not-c3p0属性名称:

    jdbc.driverClassName=com.mysql.jdbc.Driver 
    jdbc.databaseURL=jdbc:mysql://localhost/my_database1_url 
    jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url 
    jdbc.username=my_username 
    jdbc.maxStockPoolSize=30 
    

    在一个标准的c3p0中。属性形式,你可能的意思是

    c3p0.driverClass=com.mysql.jdbc.Driver 
    c3p0.jdbcURL=jdbc:mysql://localhost/my_database1_url 
    # no equivalent -- jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url 
    c3p0.user=my_username 
    # no equivalent -- jdbc.maxStockPoolSize=30 
    

    请参阅Configuration Properties。同样,c3p0对jdbc.-前缀属性一无所知,但也许在你自己的库或中间件中找到了一些东西。

注:我喜欢看到@检查连接泄漏的NiSay的方式,因为我喜欢看到人们使用更先进的C3P0 API。只要你不热更新你的DataSource的配置,它就会工作。但是你不需要付出那么多麻烦,并且不能保证这种方法在将来的版本中将继续有效。c3p0对ConnectionCustomizer生命周期没有任何承诺。 ConnectionCustomizers旨在是无状态的。使用c3p0的内置泄漏检查设施更简单,更安全,如上面第一个要点所述。

+0

是的Steve im在内部将它们映射到web.xml文件中的正确值。在jdbc属性文件中指定的名称只是在web.xml文件中调用的变量。我已经明白了。 preferredTestQuery和numHelperThreads在web.xml文件中是正确的。 – user2522497

+0

谢谢史蒂夫。按照您的建议添加了unusedConnectionTimeout和debugUnreturnedConnectionStackTraces。而现在我的网站自4天以来一直没有下降。但我不知道这将持续多久,我的网站没有下降。请告诉我,如果只有连接泄漏给我造成这个问题?以及如何解决连接泄漏问题。 – user2522497

+0

@Steve Waldman +1第一点。 – Yasin

1

由于有可能在程序连接泄漏(连接超时的可能原因)的可能性,你需要遵循,以确定泄漏下面的步骤。

请在您的c3p0.properties项文件

c3p0.connectionCustomizerClassName = some.package.ConnectionLeakDetector 

名为“ConnectionLeakDetector”创建一个类,并将其放置在相应的包。以下是课程的内容。

import java.sql.Connection; 
import java.util.concurrent.atomic.AtomicInteger; 

public class ConnectionLeakDetector implements com.mchange.v2.c3p0.ConnectionCustomizer { 

    static AtomicInteger connectionCount = new AtomicInteger(0); 
    @Override 
    public void onAcquire(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 

    } 

    @Override 
    public void onDestroy(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 
    } 

    @Override 
    public void onCheckOut(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 
     System.out.println("Connections acquired: " + connectionCount.decrementAndGet()); 
    } 

    @Override 
    public void onCheckIn(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 
     System.out.println("Connections released: " + connectionCount.incrementAndGet()); 
    } 

} 

的onCheckOut方法将递增计数时,所获取的连接,其中,如将onCheckOut递减它的连接被释放时。

执行某些情况下,观察你的控制台上的统计信息。如果计数大于0,则执行的方案有连接泄漏。尝试解决它们,你会观察到不同之处。

作为一个侧面说明,您可以递增jdbc.maxPoolSize作为一个临时解决方案,直到您部署的修补程序。

+0

好的,我会尝试这个解决方案并很快发布我的回复。谢谢 – user2522497