2014-01-30 1 views
2

Похоже, что новые облачные SQL JDBC-драйверы для приложения (1) поддерживают объединение пулов.Пул соединений в движке приложения с облачным SQL

В нашем приложении используется Spring + Hibernate, и мы пытаемся использовать одну из существующих инфраструктур java для пула соединений (BoneCP, C3p0, Hikari) и до сих пор не смогли использовать ни одно из них из-за ограничений на движок приложения. Трассировка стека с использованием Spring + Hibernate + C3p0 ниже. Кто-нибудь сумел заставить это работать?

[INFO] java.lang.NoClassDefFoundError: java.lang.management.ManagementFactory is a restricted class. Please see the Google App Engine developer's guide for more details. 
[INFO] at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51) 
[INFO] at com.mchange.v2.c3p0.management.ActiveManagementCoordinator.<init>(ActiveManagementCoordinator.java:54) 
[INFO] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
[INFO] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
[INFO] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
[INFO] at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
[INFO] at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_(Runtime.java:127) 
[INFO] at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance(Runtime.java:148) 
[INFO] at com.mchange.v2.c3p0.C3P0Registry.<clinit>(C3P0Registry.java:146) 
[INFO] at java.lang.Class.forName0(Native Method) 
[INFO] at java.lang.Class.forName(Class.java:190) 
[INFO] at com.google.appengine.tools.development.agent.runtime.RuntimeHelper.checkRestricted(RuntimeHelper.java:70) 
[INFO] at com.google.appengine.tools.development.agent.runtime.Runtime.checkRestricted(Runtime.java:64) 
[INFO] at com.mchange.v2.c3p0.impl.DriverManagerDataSourceBase.<init>(DriverManagerDataSourceBase.java:212) 
[INFO] at com.mchange.v2.c3p0.DriverManagerDataSource.<init>(DriverManagerDataSource.java:72) 
.... 

(1): Старый водитель = com.google.appengine.api.rdbms.AppEngineDriver. Новый драйвер = com.mysql.jdbc.GoogleDriver.

+0

Он работает, но только на основных и ручных случаях скейлинговым. Проверьте это сообщение; http://stackoverflow.com/questions/38397337/can-i-use-hikaricp-on-google-app-engine/38397338#38397338 –

ответ

4

Мы закончили решение этой проблемы с помощью Tomcat DBCP (http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html). Проблема с большинством других пулов заключается в том, что они используют потоки, которые предотвращают использование модели механизма приложения для экземпляров frontend (долгоживущих потоков).

+1

Использовали ли вы JPA, или используете ли вы Tomcat DBCP в контексте руководства Операции JDBC? Я пытаюсь выяснить, как заставить EntityManagerFactory работать с пулом соединений ... поскольку соединение с JPA обычно работает через JNDI, а Google App Engine вообще не поддерживает JNDI. –

+0

имейте в виду, что они не поддерживают JNDI, он должен был стать механизмом объединения факторов для Java-приложений. –

3

Это старый вопрос, но я хотел бы предоставить то, что я считаю более точным ответом. Google App Engine делаетallow applications to create threads с использованием ихThreadFactory.

HikariCP позволяет настраивать внешний ThreadFactory.

Таким образом, конфигурация будет идти что-то вроде этого:

import com.google.appengine.api.ThreadManager; 
... 

HikariConfig config = new HikariConfig(); 
config.setThreadFactory(ThreadManager.backgroundThreadFactory()); 
... 

UPDATE: адресация комментария ниже о случаях внешнего интерфейса ... в noted elsewhere:

"Keep in mind that instances are created and destroyed dynamically, and requests are routed 
to instances based purely on availability. ... There is no guarantee that requests of a 
particular sort will always be handled by the same instance, nor is it assured that an 
instance will still be around after a given request is handled. Outside of a request 
handler, the application is not given the opportunity to rescue data from local memory 
prior to an instance being shut down." 

Это существенно снижает полезность соединения пулы на фронте. На самом деле, это плохая идея, если база данных не находится в памяти, так как она может создать существенный отток соединений. Что касается локальных баз данных в памяти, они не только хрупки в контексте GAE, но и связаны с избыточным соединением, что редко является фактором масштабируемости, который требует использования пула.

+0

Предостережение заключается в том, что приложение должно быть бэкэнд-приложением для GAE, чтобы это работало. Например, если у вас есть приложение только для интерфейса, которое пытается использовать базу данных в памяти, такую ​​как H2 или HSQL, это не сработает и выйдет ошибка при запуске. – manish

+0

Теперь, когда резервные копии устарели и заменены модулями, использование фоновых потоков привязано к типу масштабирования приложения. Если ваше приложение настроено на «Автоматическое масштабирование», вы получите исключение. – depsypher