found - google cloud sql java example
Grupo de conexión en el motor de la aplicación con Cloud SQL (3)
Terminamos resolviendo esto usando Tomcat DBCP ( http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html ). El problema con la mayoría de los otros grupos es que usan subprocesos, que el modelo de motor de la aplicación previene en las instancias frontend (hilos de larga duración).
Parece que los controladores SQL JDBC en la nube más nuevos para el motor de aplicaciones (1) admiten la agrupación de conexiones.
Nuestra aplicación utiliza Spring + Hibernate y estamos tratando de usar uno de los frameworks java existentes para la agrupación de conexiones (BoneCP, C3p0, Hikari), y hasta el momento no hemos podido utilizar ninguno de ellos debido a las limitaciones del motor de la aplicación. Apila el trazado usando Spring + Hibernate + C3p0 a continuación. ¿Alguien logró hacer que esto funcione?
[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): controlador anterior = com.google.appengine.api.rdbms.AppEngineDriver. Nuevo controlador = com.mysql.jdbc.GoogleDriver.
Esta es una vieja pregunta, pero quería proporcionar lo que creo que es una respuesta más precisa. Google App Engine permite que las aplicaciones creen subprocesos mediante el uso de su ThreadFactory
.
HikariCP permite configurar un ThreadFactory
externo.
Entonces, la configuración sería algo como esto:
import com.google.appengine.api.ThreadManager;
...
HikariConfig config = new HikariConfig();
config.setThreadFactory(ThreadManager.backgroundThreadFactory());
...
ACTUALIZACIÓN: dirigiendo el comentario a continuación sobre las instancias frontend ... como se menciona en otra parte :
"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."
Esto disminuye sustancialmente la utilidad de los grupos de conexiones en la interfaz. De hecho, es una mala idea si la base de datos no está en la memoria, ya que puede generar una importante pérdida de conexiones. Con respecto a las bases de datos locales en memoria, no solo son frágiles en el contexto de GAE, la "sobrecarga de conexión" rara vez es un factor de escalabilidad que justifique el uso de un grupo.
Creé un ejemplo usando Tomcat DBCP 1.4 para las instancias frontend de GAE, que no permiten que los threads vivan fuera del alcance de la solicitud. Esto funciona con Java 7.