2013-04-26 2 views
6

У меня возникла проблема с использованием моего собственного сервера базы данных с веб-приложением Google.java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup)

Я использую eclips (java EE IDE), установил все плагины Google init и разработал образец веб-приложения Google, развернул его в web.Its работал правильно.

Теперь я хочу использовать свою собственную базу данных в своем приложении (MYSQL установлен в localhost). Здесь используется Hibernate для подключения к базе данных. Весь необходимый файл jar помещается в каталог lib, который находится в папке WEB-INF.

Когда я запускаю мое приложение это дает ошибку, как ..

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 

Пожалуйста, дайте любую идею для достижения этой цели один ....

+0

Ваши настройки диспетчера безопасности Google являются причиной этой ошибки. –

+0

ohh really ,, pls как я могу решить эту проблему Ravi –

+0

Ramesh, пожалуйста, проверьте ответ Маноло. Кажется, проблема решена. –

ответ

0

я получил такое же исключение при попытке использовать Class.forName("com.mysql.jdbc.Driver"); и получил его решить, выполнив следующие действия:

  1. использовали com.google.appengine.api.rdbms.AppEngineDriver вместо com.mysql.jdbc.Driver
  2. изменил версию JDK от jdk1.7.0_25 к jdk1.7.0_21
6

Вы используете Hibernate 4.3.1 Final?

Hibernate's DriverManagerConnectionProvider пытается создать новые темы, которые не допускаются к GAE. У меня также был этот вопрос.

Проверка на GitHub говорит мне, что использование Hibernate 4.2.0.Final отлично работает. Я попытался запустить тот же пример с Hibernate 4.3.1 и получил то же Исключение. Но с 4.2 он работает так, как ожидалось.

Я собираюсь понизить Hibernate в моей App и посмотреть ..

+1

Здравствуйте, Gaël, действительно Hibernate пытается создать Threads (проверенная версия 4.3.6.Final). Есть ли другое решение, кроме понижения? .. Должна быть опция полностью отключить объединение пулов, потому что это лучший вариант при работе с Google App Engine. Есть ли возможность включить создание потоков в новых версиях Hibernate? –

4

На этой неделе я пытался использовать гибернации 4.3.6.Final в Google App Engine проекта/Google Cloud Sql и побежал в описанная выше проблема (java.security.AccessControlException). В предыдущих проектах GAE/GCS я без проблем использовал Hibernate 4.3.0.Beta3.

Как уже упоминалось ранее Gaël Oberson, проблема заключается в новой реализации пула соединений по умолчанию DriverManagerConnectionProviderImpl в спящем режиме. Этот пул соединений пытается создать новые потоки с помощью Исполнителей.newSingleThreadScheduledExecutor;

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

This is not allowed on Google App Engine;

Java, приложение может создать новый поток, но есть некоторые ограничения, как это сделать. Эти потоки не могут «пережить» запрос , который их создает.

Реальная проблема заключается в конфигурации Hibernate, которая не позволяет использовать нет пула соединений. Согласно Google this connection pool is even not necessary on GAE/GCS;

Как лучше всего управлять подключением к базе данных зависит от вашего прецедента. Например, если время создания нового соединения с базой данных больше, чем проверка и повторное использование существующего соединения, тогда мы рекомендуем использовать пул соединений. И наоборот, если время до создает новое соединение, то оно будет таким же, как и тестирование, если существующее соединение живое и повторное его использование, тогда мы рекомендуем создать новое соединение для обслуживания каждого HTTP-запроса и повторно использовать его для продолжительность запроса. В частности, последний случай может применяться, когда вы подключаетесь из Google App Engine к Google Cloud SQL.

Подведено; нам не нужен пул соединений в GAE/GCS, но Hibernate не предоставляет возможность объединения без подключения.

Из-за ограниченного графика я пошел на быстрое решение; Я написал свою собственную версию DriverManagerConnectionProviderImpl. Эта версия не поддерживает администрирование соединений, а просто открывает и закрывает соединение при вызове. Есть несколько возможностей для улучшения, потому что я должен повторно использовать соединение в течение всего времени запроса ... Другим решением было бы использование утвержденных потоков GAE ...

По моему мнению, Hibernate должен предоставить возможность объединения в GAE/Разработчики GCS. I already posted this topic at the Hibernate Community.

Смежные вопросы