0
我有一個簡單的REST服務設置,它接收來自另一個服務的數據並將其放入數據庫。我計劃將它作爲包含服務和服務器的jar文件運行。代碼我已經是:運行HttpServer時無法創建新的本地線程
public class Main {
public static void main(String[] args) throws IOException {
ResourceConfig config = new DefaultResourceConfig(MyResource.class);
HttpServer server = HttpServerFactory.create("http://localhost:8080/", config);
server.start();
// ...
}
MyResource
@Path("/rest")
public class MyResource {
public MyResource(){
dbConnection = new DbConnection();
}
private final DbConnection dbConnection;
@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_XML)
public Response addItem(MyItem dao){
dbConnection.addItem(dao);
return Response.status(200).build();
}
在的DbConnection,在構造函數中MysqlDataSource
,一旦它得到一個項目,它把的它變成blockingQueue
,另一個線程監聽並處理寫入到數據庫。
現在的問題是,每次接收到新的請求時,都會重新創建MyResource,調用構造函數,因此會再次啓動DbConnection類以及所有隨附的類。如何避免它?它導致:
com.sun.jersey.api.container.MappableContainerException: java.lang.OutOfMemoryError: unable to create new native thread
at com.sun.jersey.server.impl.resource.PerRequestFactory$PerRequest._getInstance(PerRequestFactory.java:189)
at com.sun.jersey.server.impl.resource.PerRequestFactory$AbstractPerRequest.getInstance(PerRequestFactory.java:144)
at com.sun.jersey.server.impl.application.WebApplicationContext.getResource(WebApplicationContext.java:239)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:83)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:714)
at myPackage.Db.DbConnection.<init>(DbConnection.java:61)
at myPackage.MyResource.<init>(MyResource.java:21)
at sun.reflect.GeneratedConstructorAccessor19.newInstance(Unknown Source)
Exception in thread "Thread-2" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:714)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371)
at sun.net.httpserver.ServerImpl$Dispatcher.handle(ServerImpl.java:433)
at sun.net.httpserver.ServerImpl$Dispatcher.run(ServerImpl.java:398)
at java.lang.Thread.run(Thread.java:745)
在AddItem方法創建DBConnection的,然後在返回前關閉它。如果您使用連接池,這將更便宜。 – mikea 2014-12-02 14:21:56