2014-12-02 53 views
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) 
+0

在AddItem方法创建DBConnection的,然后在返回前关闭它。如果您使用连接池,这将更便宜。 – mikea 2014-12-02 14:21:56

回答

相关问题