簡體   English   中英

空閑一段時間后失去JPA連接

[英]Losing JPA connection after some idle time

每當API空閑一段時間后,我的確會失去與數據庫的連接(無法精確定義時間。它可能發生在幾秒鍾的空閑時間之后,有時是幾分鍾后的空閑時間,有時甚至是在跳船重啟之后)。 這個問題可以在不同的機器上重現,所以我確認它與mysql數據庫沒有直接關系。

拋出的異常可以在這里找到

數據庫配置基於休眠和彈簧:

 <!-- c3p0 of version 0.9.2.1 (current stable) -->
 <!-- spring data: 1.2.0.RELEASE -->
 <!-- mysql connector: 5.1.18 -->
 <!-- hibernate: 4.1.9.FINAL --> 
 <bean id="basisDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClassName}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="20" />
    <property name="maxIdleTime" value="600" />
    <property name="maxConnectionAge" value="86400" />
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="de.yourdelivery.data.*" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="true" />
            <property name="database" value="MYSQL" />
        </bean>
    </property
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

數據庫連接和驅動程序如下:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://xxx:3306/xxx?zeroDateTimeBehavior=convertToNull

它甚至無法通過以下方式擴展jdbc.url

&autoReconnect=true&autoReconnectForPools=true

我在推土機映射期間使用OpenSessionInView Pattern延遲加載了我所有需要的關系(我知道這被認為是一種反模式,但到目前為止效果很好,因此目前還沒有將其歸咎於該模式)

MySQL的wait_timeout設置為28800

C3PO的啟動日志如下所示

13:34:54,687 INFO PropertySourcesPlaceholderConfigurer:177-從文件[/opt/jetty/jetty-distribution-8.1.8.v20121106/webapps/rest/WEB-INF/classes/properties/customer.fidelity.points.properties加載屬性文件] 13:34:54,687 INFO PropertySourcesPlaceholderConfigurer:177-從文件[/opt/jetty/jetty-distribution-8.1.8.v20121106/webapps/rest/WEB-INF/classes/properties/application.properties]中加載屬性文件13: 34:54,687 INFO PropertySourcesPlaceholderConfigurer:177-從文件[/opt/jetty/jetty-distribution-8.1.8.v20121106/webapps/rest/WEB-INF/classes/properties/restapi.properties]加載屬性文件13:34:54,688 INFO PropertySourcesPlaceholderConfigurer:177-從文件[/opt/jetty/jetty-distribution-8.1.8.v20121106/webapps/rest/WEB-INF/classes/properties/database.properties]加載屬性文件13:34:54,823 INFO MLog: 80-使用log4j日志記錄的MLog客戶端。 13:34:54,883 INFO C3P0Registry:204-初始化c3p0-0.9.1.2 [建於2007年5月21日15:04:56; 調試? 真正; 跟蹤:10] 13:34:55,111信息XmlWebApplicationContext:1350-類型[類com.mchange.v2.c3p0.ComboPooledDataSource]的Bean'deDataSource'不適合所有BeanPostProcessor處理(例如:不符合自動13:34:55,148 INFO XmlWebApplicationContext:1350-類型[類com.mchange.v2.c3p0.ComboPooledDataSource]的Bean'plDataSource'不適合所有BeanPostProcessor處理(例如:不適合自動代理) 13:34:55,150 INFO XmlWebApplicationContext:1350-類型為[class de.yourdelivery.data.routing.DomainRouting]的Bean'dataSource'不適合所有BeanPostProcessor處理(例如:不符合自動代理資格)13: 34:55,167 INFO XmlWebApplicationContext:1350-類型[class org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]類型的Bean'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#24bb6086'不適合所有BeanPostProcessors處理(考試 mple:不符合自動代理的條件)13:34:55,213 INFO LocalContainerEntityManagerFactoryBean:264-為持久性單元“默認”構建JPA容器EntityManagerFactory 13:34:55,332 INFO版本:37-HCANN000001:Hibernate Commons Annotations {4.0.1.Final } 13:34:55,338信息版本:41-HHH000412:Hibernate Core {4.1.9.Final} 13:34:55,341信息環境:239-HHH000206:找不到hibernate.properties 13:34:55,342信息環境:342-HHH000021 :字節碼提供程序名稱:javassist 13:34:55,361 INFO Ejb3Configuration:527-HHH000204:處理PersistenceUnitInfo [名稱:默認...] 13:34:55,795 INFO ConnectionProviderInitiator:188-HHH000130:實例化顯式連接提供程序:org.hibernate.ejb .connection.InjectedDataSourceConnectionProvider 13:34:55,880信息AbstractPoolBackedDataSource:462-初始化c3p0池... com.mchange.v2.c3p0.ComboPooledDataSource [acquisitionIncrement-> 3,acquireRetryAttempts-> 30,acquireRetryDelay-> 1000,autoCommitOnClose-> false ,automaticTestTable-> null,breakAfterAcquireFailure-> false,checkoutTimeout-> 0,connectionCustomizerClassName-> null,connectionTesterClassName-> com.mchange.v2.c3p0.impl.DefaultConnectionTester,dataSourceName-> 1hge17b8s1e4h6uz10tbcor | 3efesce3ce -T > null,driverClass-> com.mysql.jdbc.Driver,factoryClassLocation-> null,forceIgnoreUnresolvedTransactions-> false,identityToken-> 1hge17b8s1e4h6uz10tbcor | 3efe0ce9,idleConnectionTestPeriod-> 0,initialPoolSize-> 3,jdbcUrl-> jdbcUrl:// 192.168.1.10:3306/xxxx?zeroDateTimeBehavior=convertToNull,maxAdministrativeTaskTime-> 0,maxConnectionAge-> 86400,maxIdleTime-> 600,maxIdleTimeExcessConnections-> 0,maxPoolSize-> 20,maxStatements-> 0,maxStatementsPerConnection-> 0,minPoolSize 5,numHelperThreads-> 3,numThreadsAwaitingCheckoutDefaultUser-> 0,preferredTestQuery-> null,屬性-> {user = * ,密碼= * },propertyCycle-> 0,testConnectionOnCheckin-> false,testConnectionOnCheckout-> false,unreturnedConnectionTimeout-> 0,usesTraditionalReflectiveProxies-> false] 13:34:56,086 INFO方言:123-HHH000400:使用方言:org.hibernate.dialect.MySQLDialect 13:34:56,095 INFO LobCreatorBuilder:120-HHH000424:禁用上下文LOB創建,因為createClob()方法引發錯誤:java.lang.reflect.InvocationTargetException 13:34:56,108 INFO TransactionFactoryInitiator:73-HHH000268:事務策略:org.hibernate。 engine.transaction.internal.jdbc.JdbcTransactionFactory 13:34:56,112 INFO ASTQueryTranslatorFactory:48-HHH000397:Using ASTQueryTranslatorFactory 13:34:56,149 INFO Version:24-Hibernate Validator 4.2.0.Final 13:34:56,916 INFO XmlWebApplicationContext:1350-類型為[class org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]的Bean'entityManagerFactory'不適合所有BeanPostProcessor處理(例如:不適用於au 代理)

那么,為什么應用程序在空閑時間失去連接?

有趣的問題

可能由於多種原因而發生。 您的應用服務器丟失了與數據庫的連接。 很難看出日志,只有空閑的連接才是唯一被殺死的連接。 您的數據庫服務器可能未分配連接。 我希望您已經檢查了數據庫日志中的錯誤。 您如何處理服務中的交易? 您在使用春季交易嗎?

如果您使用的是外部連接池提供程序,則最好始終指定destroy-method,以便在spring應用程序關閉時立即關閉數據源。

<bean id="basisDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

在c3p0池設置中更改以下內容

采取兩種方法刪除maxConnectionAgemaxIdleTime

通過更改以下兩個參數進行測試,它們對性能的影響是昂貴的

testConnectionOnCheckout =true 
preferredTestQuery =SELECT 1

如果您能夠使用上述設置解決該問題

將上面的設置更改為下面的設置,因為以下設置對性能的影響較小

idleConnectionTestPeriod – 30 
preferredTestQuery =SELECT 1

發表您的發現

您需要定期進行連接測試,以使防火牆等網絡設備不會終止連接。 這里的所有詳細信息: C3P0配置

我會檢查

我建議,首先按照“ user395072”的建議在應用程序bean配置中添加一個destroy方法。

除此之外,請檢查mySQL連接和服務器配置屬性。 我相信,mySQL有大約1000個查詢的默認限制(我在mySQL 5.24上看到過)。 據我的最佳猜測,斷開連接發生在mySQL層-服務器可能正在“認為”不再需要連接。 如果存在“斷開連接”的固定時間范圍或與斷開連接相關的任何用戶事件,則可能存在應用程序配置問題。

在您的情況下,我強烈認為這是數據庫服務器配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM