2013-04-26 3 views
6

Ich habe ein Problem bei der Verwendung meiner eigenen Datenbankserver mit Google-Webanwendung.java.security.AccessControlException: Zugriff verweigert (java.lang.RuntimePermission modifyThreadGroup)

Ich benutze eclips (Java EE IDE), installierte alle Google Plugins init, und entwickelte ein Beispiel Google Webapplikation, entfaltete es in web.Its funktioniert korrekt.

Jetzt möchte ich meine eigene Datenbank in meiner App verwenden. (MYSQL in localhost installiert). Hier wird Hibernate zur Verbindung mit der Datenbank verwendet. Alle erforderlichen JAR-Dateien werden im Verzeichnis lib abgelegt, das sich im Ordner WEB-INF befindet.

Wenn ich betreibe meine Anwendung ein Fehler gibt wie ..

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 

Bitte jede Idee geben dieses zu erreichen ....

+0

Die Einstellungen Ihres Google-Sicherheits-Managers verursachen diesen Fehler. –

+0

ohh wirklich ,, pls wie könnte ich dieses eine Ravi –

+0

Ramesh lösen, überprüfen Sie bitte Manolo's Antwort. Es scheint das Problem zu lösen. –

Antwort

0

bekam ich die gleiche Ausnahme während Class.forName("com.mysql.jdbc.Driver"); zu verwenden versucht, habe es, indem Sie die folgenden gelöst: statt com.mysql.jdbc.Driver

  1. com.google.appengine.api.rdbms.AppEngineDriver
  2. geändert, um die JDK-Version verwendet von jdk1.7.0_25 zu jdk1.7.0_21
6

Verwenden Sie Hibernate 4.3.1 Final?

Hibernate's DriverManagerConnectionProvider versucht, neue Threads zu erstellen, was auf GAE nicht erlaubt ist. Ich hatte auch dieses Problem.

Auschecken Googles auf GitHub sagte mir, dass Hibernate 4.2.0.Final funktioniert gut. Ich habe versucht, das gleiche Beispiel mit Hibernate 4.3.1 auszuführen und habe die gleiche Ausnahme erhalten. Aber mit 4.2 läuft es wie erwartet.

Ich werde Herabstufung Hibernate in meine App und sehen ..

+1

Hallo Gaël, tatsächlich Hibernate versucht Threads zu erstellen (versuchte Version 4.3.6.Final). Gibt es eine andere Lösung als Downgrade? Es sollte eine Option geben, um das Verbindungs-Pooling vollständig zu deaktivieren, da dies die beste Option ist, wenn Sie mit Google App Engine arbeiten. Gibt es eine Option, Thread-Erstellung in neuen (er) Hibernate-Versionen zu deaktivieren? –

4

Diese Woche habe ich versucht Hibernate 4.3.6.Final in einer Google App Engine/Google Cloud SQL-Projekt zu verwenden und lief in das oben beschriebene Problem (java.security.AccessControlException). In früheren GAE/GCS Projekten habe ich Hibernate 4.3.0.Beta3 ohne Probleme benutzt.

Wie Gaël Oberson bereits oben erwähnt, ist das Problem die neue Implementierung des Standard-Verbindungspool DriverManagerConnectionProviderImpl in Hibernate. Dieser Verbindungspool versucht, neue Threads mit Executoren zu erzeugen.newSingleThreadScheduledExecutor;

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

This is not allowed on Google App Engine;

Eine Java-Anwendung kann einen neuen Thread erstellen, aber es gibt einige Beschränkungen auf, wie es zu tun. Diese Threads können die Anforderung, die sie erstellt, nicht "überleben".

Das eigentliche Problem ist die Hibernate-Konfiguration, die nicht die Verwendung von keine Verbindung Pool nicht gestattet. Laut Google this connection pool is even not necessary on GAE/GCS;

Wie Sie Ihre Datenbankverbindungen am besten verwalten, hängt von Ihrem Anwendungsfall ab. Wenn beispielsweise die Zeit zum Erstellen einer neuen Datenbankverbindung höher ist als das Überprüfen und erneute Verwenden einer vorhandenen Verbindung, empfehlen wir Ihnen, das Verbindungspooling zu verwenden. Umgekehrt, wenn die Zeit bis eine neue Verbindung zu erstellen ist etwa das gleiche wie testen, wenn eine bestehende Verbindung lebt und es wiederverwenden, dann empfehlen wir, erstellen Sie eine neue Verbindung für jede HTTP-Anfrage und wieder für die Dauer der Anfrage Der letzte Fall trifft insbesondere zu, wenn Sie eine Verbindung von Google App Engine zu Google Cloud SQL herstellen.

zusammengefasst; Wir benötigen kein Verbindungs-Pooling auf GAE/GCS, aber Hibernate bietet standardmäßig keine Verbindungsoptionen ohne Verbindung.

Wegen eines engen Zeitplans ging ich für eine schnelle Lösung; Ich habe meine eigene Version von DriverManagerConnectionProviderImpl geschrieben. Diese Version verwaltet keine Verbindungen, sondern öffnet und schließt nur die Verbindung bei einem Anruf. Es gibt Raum für Verbesserungen, weil ich die Verbindung für die Dauer der Anfrage wiederverwenden sollte ... Eine andere Lösung wäre die Verwendung von genehmigten GAE-Threads ...

Meiner Meinung nach sollte Hibernate das keine Pooling-Option für GAE/GCS-Entwickler. I already posted this topic at the Hibernate Community.

Verwandte Themen