【问题标题】:java.security.AccessControlException: access denied (java.lang.RuntimePermission modifyThreadGroup)java.security.AccessControlException:访问被拒绝(java.lang.RuntimePermission modifyThreadGroup)
【发布时间】:2013-04-20 04:59:15
【问题描述】:

我在将自己的数据库服务器与 Google 网络应用程序一起使用时遇到问题。

我正在使用 eclips (java EE IDE),安装了所有 google 插件 init,并开发了一个示例 google web 应用程序,将其部署到 web。它工作正常。

现在我想在我的应用程序中使用我自己的数据库。(安装在本地主机中的 MYSQL)。 这里我使用 Hibernate 连接数据库。所有需要的jar文件都放在WEB-INF文件夹下的lib目录中。

当我运行我的应用程序时,它会出现类似 ..

的错误
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

请给出任何想法来实现这一点......

【问题讨论】:

  • 您的 Google 安全管理器设置是导致此错误的原因。
  • 哦,真的,请问我该如何解决这个 Ravi
  • Ramesh,请查看 Manolo 的回答。它似乎解决了这个问题。
  • 好吧,在项目开发的初期,维护谷歌数据库(云SQL)是不可能的。我们有自己的服务器(MYSQL)。所以我想使用 URL(主机名)、用户名和密码与该数据库连接。如果我在 localhost 中成功,那么我将更改我与服务器数据库的连接。所以有没有其他选择选择是有拉维特里维迪..
  • ya Ravi...我想以这种方式运行我的应用程序..

标签: java hibernate google-app-engine gwt hibernate-mapping


【解决方案1】:

你使用 Hibernate 4.3.1 Final 吗?

Hibernate 的DriverManagerConnectionProvider 尝试创建新线程,这在 GAE 上是不允许的。我也有这个问题。

在 GitHub 上查看 Google 的 example 告诉我,使用 Hibernate 4.2.0.Final 可以正常工作。我尝试使用 Hibernate 4.3.1 运行相同的示例并得到相同的异常。但在 4.2 中,它的运行与预期一样。

我要在我的应用程序中降级 Hibernate 看看..

【讨论】:

  • 你好 Gaël,Hibernate 确实尝试创建线程(尝试版本 4.3.6.Final)。除了降级还有其他解决方案吗?.. 应该有一个完全禁用连接池的选项,因为这是从 Google App Engine 工作时的最佳选择。是否可以选择在新的(呃)Hibernate 版本中关闭线程创建?
【解决方案2】:

本周我尝试在 Google App Engine / Google Cloud Sql 项目中使用 Hibernate 4.3.6.Final 并遇到了上述问题( java.security.AccessControlException)。在早期的 GAE/GCS 项目中,我使用 Hibernate 4.3.0.Beta3 没有任何问题。

正如 Gaël Oberson 上面已经说过的,问题在于 Hibernate 中默认连接池 DriverManagerConnectionProviderImpl 的新实现。此连接池尝试使用 Executors.newSingleThreadScheduledExecutor 生成新线程;

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

This is not allowed on Google App Engine;

Java 应用程序可以创建一个新线程,但有一些 限制如何去做。这些线程不能“活得更久” 创建它们的请求。

实际问题是不允许使用无连接池的Hibernate配置。根据谷歌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。

【讨论】:

    【解决方案3】:

    按照这个:

    1. Appengine 有自己的 MySQL 版本,称为 Cloud SQL。请参阅有关如何use your own MySQL instance during development 的文档。请注意,您不能在生产环境中使用自己的 MySQL。

    2. 请参阅文档以了解如何使用 make Cloud SQL work with Hibernate。

    【讨论】:

      【解决方案4】:

      我在尝试使用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

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 2014-03-15
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-06
        相关资源
        最近更新 更多