2012-12-02 21 views
5

जावा एप्लिकेशन बनाने के लिए मैं Play 2.0.2 का उपयोग कर रहा हूं। कुछ दिनों के लिए मैं एक समस्या में भाग रहा हूँ। ~ 100 अनुरोध करने के बाद सर्वर इस अपवाद फेंकने के लिए शुरू होता है:प्ले 2.0 रिटर्न "एसक्यूएलएक्सप्शन: एक मुफ्त उपलब्ध कनेक्शन के लिए इंतजार कर रहा है।"

[[SQLException:। एक नि: शुल्क उपलब्ध कनेक्शन के लिए प्रतीक्षा की अवधि समाप्त]]

मैं DB.getConnection() साथ Connection का एक नया उदाहरण बना सकते हैं। मैं Connection उदाहरण बंद नहीं करता क्योंकि प्रत्येक अनुरोध का केवल एक उदाहरण है और जहां तक ​​मुझे पता है कि सक्रिय टीसीपी कनेक्शन बंद होने पर यह स्वचालित रूप से Connection उदाहरण बंद कर देता है। मैंने db.default.connectionTimeout मान 100 seconds पर बढ़ाने की कोशिश की लेकिन यह समस्या को ठीक नहीं कर सका। फिर मैंने सक्रिय पोस्टग्रेस्क्ल कनेक्शन की जांच की और कोई सक्रिय कनेक्शन नहीं था। इसके अलावा मैंने Postgresql को पुनरारंभ किया लेकिन यह समस्या को ठीक नहीं कर सका।

अब इस समस्या का एकमात्र समाधान Play20 इंस्टेंस को मार रहा है और एक नया शुरू कर रहा है। आप उल्लेख है कि

! @6cg9il6ki - Internal server error, for request [GET [AN URL]] -> 

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[SQLException: Timed out waiting for a free available connection.]] 
     at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134) [play_2.9.1.jar:2.0.2] 
     at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) [play_2.9.1.jar:2.0.2] 
     at akka.actor.Actor$class.apply(Actor.scala:318) [akka-actor.jar:2.0.2] 
     at play.core.ActionInvoker.apply(Invoker.scala:113) [play_2.9.1.jar:2.0.2] 
     at akka.actor.ActorCell.invoke(ActorCell.scala:626) [akka-actor.jar:2.0.2] 
     at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) [akka-actor.jar:2.0.2] 
Caused by: java.sql.SQLException: Timed out waiting for a free available connection. 
     at com.jolbox.bonecp.BoneCP.getConnection(BoneCP.java:503) ~[bonecp.jar:0.7.1.RELEASE] 
     at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:114) ~[bonecp.jar:0.7.1.RELEASE] 
     at play.api.db.DBApi$class.getConnection(DB.scala:64) ~[play_2.9.1.jar:2.0.2] 
     at play.api.db.BoneCPApi.getConnection(DB.scala:273) ~[play_2.9.1.jar:2.0.2] 
     at play.api.db.DB$$anonfun$getConnection$1.apply(DB.scala:129) ~[play_2.9.1.jar:2.0.2] 
     at play.api.db.DB$$anonfun$getConnection$1.apply(DB.scala:129) ~[play_2.9.1.jar:2.0.2] 
+0

AFAIK, आप उपयोग के बाद कनेक्शन (उदाहरण के लिए एक 'finally' ब्लॉक में) को बंद करने के लिए है –

+0

http://stackoverflow.com/questions/16275102/sqlexception-timed-out-waiting-for-a -फ्री-उपलब्ध-कनेक्शन/28395713 # 28395713 –

उत्तर

3

:

यहाँ लॉग बनाया Play2.0 है

मैं कनेक्शन उदाहरणों क्योंकि प्रत्येक अनुरोध का केवल एक ही उदाहरण बंद नहीं करते

यह गलत है, आपको इसे बंद करना होगा अन्यथा आप जो समस्या देखते हैं उसके साथ समाप्त होते हैं।

कारण यह है कि आपको सीधे जेडीबीसी कनेक्शन मिल रहा है, न कि ओआरएम (ईबीन या कुछ अन्य जेपीए-अनुरूप) द्वारा प्रबंधित किया गया है, इसलिए यदि आप इसे बंद नहीं करते हैं तो कनेक्शन थोड़ी देर के लिए लटक रहा है।

+0

@hi Pere Villega मेरे पास एक ही समस्या है http://stackoverflow.com/questions/24527954/play-framework-2-2-error-this-exception-has-been- लॉग-इन-आईडी क्या आप इसे हल कर सकते हैं .. मैं एक ओआरएम का उपयोग कर रहा हूं और अभी भी इस मुद्दे का सामना कर रहा हूं। – Incpetor

1

डीबी.withConnection का उपयोग करें, यह एक बार किए जाने के बाद कनेक्शन बंद कर देता है।

+0

ऐसा लगता है कि डीबी.with कनेक्शन केवल स्कैला के लिए उपलब्ध है। स्केल के लिए –

+2

+1 :) –

0

डेटाबेस के लिए फ्रेमवर्क जावा कार्यान्वयन प्ले इस तरह कुछ होना चाहिए।

try{ 
     Ebean.beginTransaction(); 

     // your code goes here 
     // if all things go fine 
     Ebean.commitTransaction(); 


}catch (Exception e){ 
     //got error so log it. 
     e.printStackTrace(); 

}finally{ 
     //End the transactions started 
     Ebean.endTransaction(); 
}