2013-04-26 9 views
6

Mam problem z używaniem własnego serwera bazy danych za pomocą aplikacji internetowej Google.java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup)

Korzystam z eclips (java EE IDE), instaluję wszystkie wtyczki google init i rozwijam przykładową aplikację internetową google, wdrażam ją do sieci. Działa poprawnie.

Teraz chcę użyć mojej własnej bazy danych w mojej aplikacji. (MYSQL zainstalowany w localhost). Tutaj używam Hibernate do łączenia się z bazą danych. Wszystkie wymagane pliki jar są umieszczane w katalogu lib, który znajduje się w folderze WEB-INF.

gdy uruchomię mojej aplikacji daje błąd jak ..

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 

Proszę podać wszelkie pomysł, aby osiągnąć ten jeden ....

+0

Twoje ustawienia zabezpieczeń Menedżera bezpieczeństwa Google powodują ten błąd. –

+0

ohh naprawdę, jak mogę rozwiązać ten jeden Ravi –

+0

Ramesh, proszę sprawdzić odpowiedź Manolo. Wydaje się, że rozwiązuje problem. –

Odpowiedz

0

Mam ten sam wyjątek podczas próby korzystania Class.forName("com.mysql.jdbc.Driver"); i dostałem go rozwiązać, wykonując następujące czynności:

  1. wykorzystywane com.google.appengine.api.rdbms.AppEngineDriver zamiast com.mysql.jdbc.Driver
  2. zmienił wersję jdk z jdk1.7.0_25 do jdk1.7.0_21
6

Czy korzystasz z Hibernate 4.3.1 Final?

Hibernate ma DriverManagerConnectionProvider próbuje utworzyć nowe wątki, co nie jest dozwolone w GAE. Też miałem ten problem.

Sprawdzanie Google example na GitHub powiedział mi, że przy użyciu Hibernate 4.2.0.Final działa dobrze. Próbowałem uruchomić ten sam przykład z Hibernate 4.3.1 i otrzymałem ten sam wyjątek. Ale z 4.2 działa zgodnie z oczekiwaniami.

Będę downgrade Hibernate w mojej aplikacji i zobaczyć ..

+1

Witaj Gaël, w rzeczy samej Hibernate próbuje stworzyć wątki (wypróbowana wersja 4.3.6.Final). Czy istnieje jakieś inne rozwiązanie niż obniżanie wersji? .. Powinna istnieć opcja całkowitego wyłączenia łączenia połączeń, ponieważ jest to najlepsza opcja podczas pracy z Google App Engine. Czy istnieje opcja przełączania tworzenia wątków w nowych wersjach (hi) hibernacji? –

4

tym tygodniu próbowałem użyć hibernacji 4.3.6.Final w Google App Engine/Google Cloud SQL projektu i wpadł wyżej opisany problem (java.security.AccessControlException). We wcześniejszych projektach GAE/GCS bez problemu korzystałem z Hibernate 4.3.0.Beta3.

Jak już wspomniano powyżej w Gaël Oberson, problemem jest nowa implementacja domyślnej puli połączeń DriverManagerConnectionProviderImpl w stanie hibernacji. Ta pula połączeń próbuje odrodzić nowe wątki za pomocą Executorów.newSingleThreadScheduledExecutor;

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

This is not allowed on Google App Engine;

aplikacja Java mogą tworzyć nowy wątek, ale istnieją pewne ograniczenia dotyczące jak to zrobić. Te wątki nie mogą "przeżyć" żądania, które je tworzy.

Rzeczywisty problem to konfiguracja Hibernate, które nie pozwalają na wykorzystanie bez puli połączeń. Według Google this connection pool is even not necessary on GAE/GCS;

Jak najlepiej zarządzać połączeniami z bazą danych, zależy od przypadku użycia. Na przykład, jeśli czas utworzenia nowego połączenia z bazą danych jest większy niż sprawdzenie i ponowne wykorzystanie istniejącego połączenia, to zalecamy zalecić korzystanie z puli połączeń. Odwrotnie, jeśli czas na utworzy nowe połączenie, będzie mniej więcej taki sam, jak w przypadku testowania, jeśli istniejące połączenie jest żywe i ponowne użycie go, zalecamy utworzenie nowego połączenia w celu obsługi każdego żądania HTTP i ponowne użycie go pod kątem czas trwania wniosku. W szczególności ten drugi przypadek może mieć zastosowanie, gdy łączysz się z Google App Engine z Google Cloud SQL.

podsumowane; nie potrzebujemy buforowania połączeń w GAE/GCS, ale Hibernate nie zapewnia opcji łączenia bez połączenia po wyjęciu z pudełka.

Ze względu na napięty harmonogram zdecydowałem się na szybkie rozwiązanie; napisałem własną wersję DriverManagerConnectionProviderImpl. Ta wersja nie utrzymuje administrowania połączeniami, ale po prostu otwiera i zamyka połączenie podczas rozmowy. Jest trochę miejsca na poprawę, ponieważ powinienem ponownie wykorzystać połączenie na czas trwania żądania ... Innym rozwiązaniem byłoby użycie zatwierdzonych wątków GAE ...

Moim zdaniem Hibernate powinien zapewnić opcję braku pulowania dla GAE/Programiści GCS. I already posted this topic at the Hibernate Community.