与App Engine兼容的JDBC连接池 [英] JDBC connection pool compatible with App Engine

查看:105
本文介绍了与App Engine兼容的JDBC连接池的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

注意:我知道线程,但它是相当老,而且,解决方案不适合我。



我正在使用App Engine和Cloud SQL,我想共享应用程序当前所有用户之间的开放连接池。我尝试了几个连接池实现,并且它们都与本地开发服务器完美协作,但是,当部署到云时,它们会失败。我想这是因为App Engine的受限沙箱环境。有人知道JDBC连接池在App Engine上工作吗?



Apache Commons DBCP

  ... 
导致:java.lang.NoClassDefFoundError:无法初始化com.google.appengine类org.apache.commons.dbcp2.PoolableConnection
.runtime.Request.process -a49d46300800d0ca(Request.java)
at org.apache.commons.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:254)
at org.apache.commons.dbcp2.BasicDataSource (BasicDataSource.java:2162)
at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2148)
at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource的.java:1903)
在org.apache.commons.dbcp2.BasicDataSource $ PaGetConnection.run(BasicDataSource.java:2267)
在org.apache.commons.dbcp2.BasicDataSource $ PaGetConnection.run(的BasicDataSource .java:2263)$ java.util.AccessController.doPr中的
在(org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1404)
...

Tomcat JDBC连接池

  ... 
导致:java.lang.SecurityException:无法获取类org.apache.tomcat.jdbc.pool.DataSource的成员

...

导致:java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
... 45 more
导致:java.lang.NoClassDefFoundError:javax / management / MalformedObjectNameException
在java.lang.Class.getDeclaredMethods0(本地方法)$ b $在java.lang.Class.privateGetDeclaredMethods(Class.java:2517)
... 45更多
由java导致。 lang.ClassNotFoundException:javax.management.MalformedObjectName例外
... 45 more

HikariCP

  ... 
java.security.AccessControlException:访问被拒绝(java.lang.RuntimePermissionmodifyThreadGroup)
。在java.security.AccessControlContext.checkPermission(AccessControlContext.java:375)
在java.security.AccessController.checkPermission(AccessController.java:565)
在java.lang.SecurityManager.checkPermission(安全管理器.java:549)
at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
at java.lang.Thread.init(Thread.java:378)
at java。 lang.Thread<初始化>(Thread.java:527)
。在com.zaxxer.hikari.util.DefaultThreadFactory.newThread(DefaultThreadFactory.java:32)
。在java.util.concurrent.ThreadPoolExecutor中$工人<初始化>(ThreadPoolExecutor.java:591)
。在java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:922)
。在java.util.concurrent.ThreadPoolExecutor.ensurePrestart( ThreadPoolExecutor.j ava:1591)
at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:305)
at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:542)
在com.zaxxer.hikari.pool.HikariPool<初始化>(HikariPool.java:161)
。在com.zaxxer.hikari.pool.HikariPool<初始化>(HikariPool.java:114)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:102)
...

Vibur DBCP

  ... 
引起:java。 security.AccessControlException:访问被拒绝(java.lang.RuntimePermissionmodifyThreadGroup)$ b $在java.security.AccessControlContext.checkPermission(AccessControlContext.java:375)$ b $在java.security.AccessController.checkPermission AccessController.java:565)
在java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
在java.lang.ThreadGroup.checkAccess(ThreadGroup.java: (Thread.java:478)
at java.lang.Thread.init(Thread.java:378)
at java.lang.Thread。< init>(Thread.java:448)
at org。 < init>(SamplingPoolReducer.java:78)
at org.vibur.dbcp.pool.PoolOperations $ PoolReducer。< init>(PoolOperations.java:88)
在org.vibur.dbcp.pool.PoolOperations $ PoolReducer。< init>(PoolOperations.java:86)
at org.vibur.dbcp.pool.PoolOperations。< init>(PoolOperations.java:79 )
at org.vibur.dbcp.ViburDBCPDataSource.start(ViburDBCPDataSource.java:197)
....

c3p0

  ... 
引起:java.security.AccessControlException:访问被拒绝( java.lang.RuntimePermission modifyThreadGroup)
在java.security.AccessControlContext.checkPermission(AccessControlContext.java:375)
在java.security.AccessController .checkPermission(AccessController.java:565)
位于java.lang.SecurityManager.checkPermission(SecurityMana ger.java:549)
at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
at java.lang.Thread.init(Thread.java:378)
at java .lang.Thread。< init>(Thread.java:487)
...


https://github.com/kennberg/appengine- java-connection-pool



请注意,一旦请求过多,连接池就非常必要,因为每个实例的挂起连接数量有限制。重新使用连接有助于保持在限制之下。


Note: I know about this thread but it is quite old and moreover, the solution did not work for me.

I am using App Engine along with Cloud SQL and I would like to share a pool of open connections between all of the application's current users. I have tried several connection pool implementations and they all work perfectly with the local development server, however, when deployed to the cloud, they fail. I suppose that the reason is App Engine's restricted "sandbox" environment. Does anyone know about JDBC connection pool working on App Engine?

Apache Commons DBCP

...
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.commons.dbcp2.PoolableConnection
at com.google.appengine.runtime.Request.process-a49d46300800d0ca(Request.java)
at org.apache.commons.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:254)
at org.apache.commons.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2162)
at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2148)
at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:1903)
at org.apache.commons.dbcp2.BasicDataSource$PaGetConnection.run(BasicDataSource.java:2267)
at org.apache.commons.dbcp2.BasicDataSource$PaGetConnection.run(BasicDataSource.java:2263)
at java.security.AccessController.doPrivileged(AccessController.java:63)
at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1404)
...

Tomcat JDBC Connection Pool

...
Caused by: java.lang.SecurityException: Unable to get members for class org.apache.tomcat.jdbc.pool.DataSource

...

Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
... 45 more
Caused by: java.lang.NoClassDefFoundError: javax/management/MalformedObjectNameException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2517)
... 45 more
Caused by: java.lang.ClassNotFoundException: javax.management.MalformedObjectNameException
... 45 more

HikariCP

...
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:375)
at java.security.AccessController.checkPermission(AccessController.java:565)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
at java.lang.Thread.init(Thread.java:378)
at java.lang.Thread.<init>(Thread.java:527)
at com.zaxxer.hikari.util.DefaultThreadFactory.newThread(DefaultThreadFactory.java:32)
at java.util.concurrent.ThreadPoolExecutor$Worker.<init>(ThreadPoolExecutor.java:591)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:922)
at java.util.concurrent.ThreadPoolExecutor.ensurePrestart(ThreadPoolExecutor.java:1591)
at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:305)
at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:542)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:161)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:114)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:102)
...

Vibur DBCP

...
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:375)
at java.security.AccessController.checkPermission(AccessController.java:565)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
at java.lang.Thread.init(Thread.java:378)
at java.lang.Thread.<init>(Thread.java:448)
at org.vibur.objectpool.reducer.SamplingPoolReducer.<init>(SamplingPoolReducer.java:78)
at org.vibur.dbcp.pool.PoolOperations$PoolReducer.<init>(PoolOperations.java:88)
at org.vibur.dbcp.pool.PoolOperations$PoolReducer.<init>(PoolOperations.java:86)
at org.vibur.dbcp.pool.PoolOperations.<init>(PoolOperations.java:79)
at org.vibur.dbcp.ViburDBCPDataSource.start(ViburDBCPDataSource.java:197)
....

c3p0

...
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:375)
at java.security.AccessController.checkPermission(AccessController.java:565)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
at java.lang.Thread.init(Thread.java:378)
at java.lang.Thread.<init>(Thread.java:487)
...

解决方案

I had to use Tomcat DBCP 1.4 (older version), because of the GAE frontend not allowing threads to live outside of request scope. Here's an example project: https://github.com/kennberg/appengine-java-connection-pool

Note that the connection pool is necessary once you have too many requests, because there is a limit on number of pending connections per instance. Re-using connections helps stay under the limit.

这篇关于与App Engine兼容的JDBC连接池的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆