2013-04-26 15 views
6

Ho un problema nell'utilizzo del mio server di database con l'applicazione web di Google.java.security.AccessControlException: accesso negato (java.lang.RuntimePermission modifyThreadGroup)

Utilizzo eclips (IDE EE java), installazione di tutti i plug-in di google init e sviluppo di un'applicazione Web google di esempio, distribuita nel Web. Funziona correttamente.

Ora voglio utilizzare il mio database nella mia app. (MYSQL installato in localhost). Qui sto usando Hibernate per connettermi con il database. Tutti i file jar richiesti sono posizionati nella directory lib che si trova nella cartella WEB-INF.

Quando eseguo la mia applicazione dà un errore come ..

com.google.apphosting.utils.jetty.JettyLogger warn 
WARNING: Error for /Home 
java.lang.ExceptionInInitializerError 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:169) 
    at org.hibernate.connection.DriverManagerConnectionProvider.configure(DriverManagerConnectionProvider.java:57) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56) 
    at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:397) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2006) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1289) 
    at base.Trackerlogin.service(Trackerlogin.java:56) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectRequest(DevAppServerServersFilter.java:369) 
    at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectServerRequest(DevAppServerServersFilter.java:352) 
    at com.google.appengine.tools.development.DevAppServerServersFilter.doFilter(DevAppServerServersFilter.java:115) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:421) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup) 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) 
    at java.security.AccessController.checkPermission(AccessController.java:546) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:289) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkAccess(DevAppServerFactory.java:314) 
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:288) 
    at java.lang.Thread.init(Thread.java:332) 
    at java.lang.Thread.<init>(Thread.java:419) 
    at com.mysql.jdbc.AbandonedConnectionCleanupThread.<init>(AbandonedConnectionCleanupThread.java:33) 
    at com.mysql.jdbc.NonRegisteringDriver.<clinit>(NonRegisteringDriver.java:88) 
    ... 46 more 
Apr 26, 2013 10:37:22 AM com.google.apphosting.utils.jetty.JettyLogger warn 
WARNING: Nested in java.lang.ExceptionInInitializerError: 
java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup) 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) 
    at java.security.AccessController.checkPermission(AccessController.java:546) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:289) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkAccess(DevAppServerFactory.java:314) 
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:288) 
    at java.lang.Thread.init(Thread.java:332) 
    at java.lang.Thread.<init>(Thread.java:419) 
    at com.mysql.jdbc.AbandonedConnectionCleanupThread.<init>(AbandonedConnectionCleanupThread.java:33) 
    at com.mysql.jdbc.NonRegisteringDriver.<clinit>(NonRegisteringDriver.java:88) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:169) 
    at org.hibernate.connection.DriverManagerConnectionProvider.configure(DriverManagerConnectionProvider.java:57) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56) 
    at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:397) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2006) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1289) 
    at base.Trackerlogin.service(Trackerlogin.java:56) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectRequest(DevAppServerServersFilter.java:369) 
    at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectServerRequest(DevAppServerServersFilter.java:352) 
    at com.google.appengine.tools.development.DevAppServerServersFilter.doFilter(DevAppServerServersFilter.java:115) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:421) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
Apr 26, 2013 10:37:22 AM org.hibernate.connection.DriverManagerConnectionProvider close 
INFO: cleaning up connection pool: null 

Si prega di dare alcuna idea di realizzare questo ....

+0

Le impostazioni di Google Security Manager sono la causa di questo errore. –

+0

ohh davvero, come potrei risolvere questo Ravi –

+0

Ramesh, per favore controlla la risposta di Manolo. Sembra che risolva il problema. –

risposta

0

ho avuto la stessa eccezione durante il tentativo di utilizzare Class.forName("com.mysql.jdbc.Driver"); ed ottenuto risolto facendo quanto segue:

  1. utilizzato com.google.appengine.api.rdbms.AppEngineDriver invece di com.mysql.jdbc.Driver
  2. cambiato la versione JDK da jdk1.7.0_25 a jdk1.7.0_21
6

Usi Hibernate 4.3.1 Finale?

Hibernate's DriverManagerConnectionProvider tenta di creare nuovi thread, che non è consentito su GAE. Ho anche avuto questo problema.

Controllare Google example su GitHub mi ha detto che l'uso di Hibernate 4.2.0.Final funziona correttamente. Ho provato a eseguire lo stesso esempio con Hibernate 4.3.1 e ho ottenuto la stessa eccezione. Ma con la 4.2 funziona come previsto.

sarò Hibernate downgrade nella mia app e vedere ..

+1

Ciao Gaël, infatti Hibernate prova a creare Thread (provato versione 4.3.6.Final). C'è qualche altra soluzione che il downgrade? .. Ci dovrebbe essere un'opzione per disabilitare completamente il pool di connessioni perché questa è l'opzione migliore quando si lavora da Google App Engine. Esiste un'opzione per attivare la creazione del thread in nuove versioni (er) di sospensione? –

4

Questa settimana ho cercato di usare Hibernate 4.3.6.Final in un Google App Engine progetto/Google Cloud SQL e corse in il problema sopra descritto (java.security.AccessControlException). Nei precedenti progetti GAE/GCS ho usato Hibernate 4.3.0.Beta3 senza problemi.

Come già affermato in precedenza da Gaël Oberson, il problema è la nuova implementazione del pool di connessione predefinito DriverManagerConnectionProviderImpl in Sospensione. Questo pool di connessioni tenta di generare nuovi thread con Executor.newSingleThreadScheduledExecutor;

executorService = Executors.newSingleThreadScheduledExecutor(); 
executorService.scheduleWithFixedDelay(
     new Runnable() {...} 

This is not allowed on Google App Engine;

Un'applicazione Java in grado di creare un nuovo thread, ma ci sono alcune restrizioni su come farlo. Questi thread non possono "sopravvivere" alla richiesta che li crea.

Il vero problema è la configurazione Hibernate che non consente l'uso di alcun pool di connessioni. Secondo Google this connection pool is even not necessary on GAE/GCS;

Come gestire al meglio le connessioni del database dipende dal caso d'uso. Ad esempio, se il tempo necessario per creare una nuova connessione al database è superiore al controllo e al riutilizzo di una connessione esistente, si consiglia di utilizzare il pool di connessioni . Viceversa, se il tempo per creare una nuova connessione è circa lo stesso che testare se una connessione esistente è attiva e riutilizzarla, si consiglia di creare una nuova connessione per soddisfare ogni richiesta HTTP e riutilizzarla per durata della richiesta. In particolare, quest'ultimo caso può essere applicato quando si collega da Google App Engine a Google Cloud SQL.

riepilogato; non abbiamo bisogno di un pool di connessioni su GAE/GCS, ma Hibernate non fornisce un'opzione di pool non di connessione pronta all'uso.

A causa di un programma serrato sono andato per una soluzione rapida; Ho scritto la mia versione di DriverManagerConnectionProviderImpl. Questa versione non mantiene un'amministrazione delle connessioni ma semplicemente apre e chiude la connessione su una chiamata. C'è un margine di miglioramento perché dovrei riutilizzare la connessione per la durata della richiesta ... Un'altra soluzione sarebbe l'uso di thread GAE approvati ...

A mio parere Hibernate dovrebbe fornire l'opzione no pooling per GAE/Sviluppatori GCS. I already posted this topic at the Hibernate Community.

Problemi correlati