2015-01-06 6 views
0

У меня возникла странная проблема при разработке с помощью игрового фреймворка. Мой код динамически создает сервер с соответствующей конфигурацией источника данных. Если я повторяю операцию «создать сервер» 75 раз, я получаю сообщение «Слишком много проблем подключения».Ограничение количества созданного сервера в Play Framework (EbeanServerFactory.createServer)?

Итак, может ли этот предел быть изменен или существует способ для «удаления/отмены регистрации» сервера, созданного с использованием метода EbeanServerFactory.createServer? Thx

Вот мой код создания сервера:

ServerConfig serverConfig = new ServerConfig(); 
DataSourceConfig dataSourceConfig = new DataSourceConfig(); 
String driver = "com.mysql.jdbc.Driver"; 
dataSourceConfig.setDriver(driver); 
// Ensure that driver is properly loaded 
try { 
    Class.forName(driver).newInstance(); 
} catch (InstantiationException | IllegalAccessException 
     | ClassNotFoundException e) { 
    System.out.println("Can't load database driver: "+driver+" because +Throwables.getStackTraceAsString(e)); 
    System.exit(0); 
} 
String dbUrl = "jdbc:mysql://192.168.0.2/mydatabase?characterEncoding=UTF-8"; 
String user = "myuser"; 
String password = "mypasswd"; 
dataSourceConfig.setUrl(dbUrl); 
dataSourceConfig.setUsername(user); 
dataSourceConfig.setPassword(password); 
dataSourceConfig.setCaptureStackTrace(true); 
serverConfig.setDataSourceConfig(dataSourceConfig); 
serverConfig.setName("test"); 
serverConfig.setDefaultServer(false); 
serverConfig.setDdlGenerate(true); 
serverConfig.setDdlRun(true); 
serverConfig.setRegister(true); 
try { 
    EbeanServerFactory.create(serverConfig); 
} catch (Exception e) { 
    System.out.println("Can't create server "+serverConfig.getName()+" "+Throwables.getStackTraceAsString(e)); 
} 

А вот ошибка после 74 итераций для 75-й один:

[error] c.a.e.s.l.s.DataSourcePool - FATAL: DataSourcePool [test] is down!!! 
Can't create server test com.avaje.ebeaninternal.server.lib.sql.DataSourceException: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" 
     at com.avaje.ebeaninternal.server.lib.sql.DataSourcePool.<init>(DataSourcePool.java:209) 
     at com.avaje.ebeaninternal.server.core.DefaultServerFactory.getDataSourceFromConfig(DefaultServerFactory.java:420) 
     at com.avaje.ebeaninternal.server.core.DefaultServerFactory.setDataSource(DefaultServerFactory.java:380) 
     at com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:163) 
     at com.avaje.ebeaninternal.server.core.DefaultServerFactory.createServer(DefaultServerFactory.java:65) 
     at com.avaje.ebean.EbeanServerFactory.create(EbeanServerFactory.java:58) 
     at controllers.test.MyTest.ptest(MyTest.java:247) 
     at Routes$$anonfun$routes$1$$anonfun$applyOrElse$203$$anonfun$apply$203.apply(routes_routing.scala:2473) 
     at Routes$$anonfun$routes$1$$anonfun$applyOrElse$203$$anonfun$apply$203.apply(routes_routing.scala:2473) 
     at play.core.Router$HandlerInvoker$$anon$7$$anon$2.invocation(Router.scala:183) 
     at play.core.Router$Routes$$anon$1.invocation(Router.scala:377) 
     at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:56) 
     at play.GlobalSettings$1.call(GlobalSettings.java:64) 
     at play.core.j.JavaAction$$anon$3.apply(JavaAction.scala:91) 
     at play.core.j.JavaAction$$anon$3.apply(JavaAction.scala:90) 
     at play.core.j.FPromiseHelper$$anonfun$flatMap$1.apply(FPromiseHelper.scala:82) 
     at play.core.j.FPromiseHelper$$anonfun$flatMap$1.apply(FPromiseHelper.scala:82) 
     at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:251) 
     at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:249) 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
     at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:37) 
     at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42) 
     at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386) 
     at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
     at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
     at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
     at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 

ответ

0

Нашел ...

В этом код:

try { 
    EbeanServerFactory.create(serverConfig); 
} catch (Exception e) { 
    System.out.println("Can't create server "+serverConfig.getName()+" "+Throwables.getStackTraceAsString(e)); 
} 

Получить создать EbeanServer с помощью:

EbeanServer server=null; 
try { 
     server = EbeanServerFactory.create(serverConfig); 
    } catch (Exception e) { 
     System.out.println("Can't create server "+serverConfig.getName()+" "+Throwables.getStackTraceAsString(e)); 
    } 

Затем, когда сервер не используется, просто сделать:

server.shutdown (...,...) 

... зависит от пути u're использования основного источника данных и/или драйвера JDBC

 Смежные вопросы

  • Нет связанных вопросов^_^