2012-12-02 49 views
5

Tôi đã sử dụng Play 2.0.2 để tạo một ứng dụng Java. Trong một vài ngày, tôi đang gặp vấn đề. Sau ~ 100 yêu cầu máy chủ bắt đầu ném ngoại lệ này:Play2.0 trả về "SQLException: Đã hết thời gian chờ kết nối khả dụng miễn phí".

[[SQLException:. Hết thời gian chờ cho một kết nối có sẵn miễn phí]]

tôi tạo ra một thể hiện mới của Connection với DB.getConnection(). Tôi không đóng các trường hợp Connection vì chỉ có một phiên bản của mỗi yêu cầu và theo như tôi biết nó sẽ tự động đóng Connection trường hợp khi kết nối TCP đang hoạt động bị đóng. Tôi đã cố gắng tăng giá trị db.default.connectionTimeout lên 100 seconds nhưng không thể khắc phục được sự cố. Sau đó, tôi đã kiểm tra các kết nối Postgresql đang hoạt động và không có kết nối hoạt động. Ngoài ra tôi khởi động lại Postgresql nhưng nó cũng không thể khắc phục vấn đề.

Giải pháp duy nhất cho vấn đề này hiện tại là giết chết phiên bản Play20 và bắt đầu một phiên bản mới.

Đây là Play2.0 log được tạo ra:

! @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, bạn phải ngắt kết nối sau khi sử dụng (trong một 'khối finally' ví dụ) –

+0

http://stackoverflow.com/questions/16275102/sqlexception-timed-out-waiting-for-a -free-available-connection/28395713 # 28395713 –

Trả lời

3

Bạn đề cập rằng:

Tôi không đóng các trường hợp kết nối bởi vì chỉ có một thể hiện của mỗi yêu cầu

Đó là sai, bạn phải đóng nó nếu không bạn kết thúc với vấn đề bạn nhìn thấy.

Lý do là bạn đang nhận được kết nối JDBC trực tiếp, không phải do một ORM quản lý (EBeans hoặc một số tương thích JPA khác) vì vậy nếu bạn không đóng kết nối có thể bị treo trong một thời gian.

+0

@hi Pere Villega Tôi gặp vấn đề tương tự http://stackoverflow.com/questions/24527954/play-framework-2-2-error-this-exception-has-been- log-with-id Bạn có thể giải quyết vấn đề này không .. Tôi đang sử dụng ORM và vẫn đang gặp sự cố. – Incpetor

1

Sử dụng DB.withConnection, nó đóng kết nối sau khi hoàn tất.

+0

Dường như DB.withConnection chỉ có sẵn cho Scala. –

+2

+1 cho scala :) –

0

Chơi khung Java thực hiện cho cơ sở dữ liệu phải là một cái gì đó như thế này.

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(); 
} 
Các vấn đề liên quan