请教hibernate在BAE中的数据库连接池长连接问题

时间:2022-09-22 19:25:49
因为BAE不支持长连接,所以默认的设置虽然在本机上跑的好好的,可是一上传跑了没多久就会出现 下面这个错误

Caused by:

org.hibernate.exception.JDBCConnectionException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:97)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2235)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
at org.hibernate.loader.Loader.list(Loader.java:2124)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.thunder.wlzs.servlet.CheckName.doGet(CheckName.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:735)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:720)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:520)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:138)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:564)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:213)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1097)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:447)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1031)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:200)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:445)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:269)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
at java.lang.Thread.run(Thread.java:724)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1014)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1290)
at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1282)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4468)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4434)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1577)
at org.hibernate.loader.Loader.doQuery(Loader.java:696)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2232)
... 30 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 163,749 milliseconds ago.  The last packet sent successfully to the server was 163,751 milliseconds ago.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3871)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2484)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
... 32 more


度娘说这是长连接引起的,但是我找不到如何关闭Hibernate连接池使得hibernate不使用长连接的办法
请各位大神指点

我现在的hibernate是这样配置的
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">jdbc:mysql://sqld.duapp.com:4050/XXXX</property>
<property name="connection.username">XXXX</property>
<property name="connection.password">XXXX</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>

尝试加过

<property name="connection.pool_size">0</property>
或者
     <property name="connection.autoReconnect">true</property>
<property name="connection.autoReconnectForPools">true</property> 
<property name="connection.is-connection-validation-required">true</property> 

都没用

3 个解决方案

#1


换个连接池 换成c3p0 或者dbcp 连接池具体配置如下 可在网上查找补充
#----------c3p0配置
#最大的连接池大小
c3p0.maxPoolSize=20000
#最小的连接池大小
c3p0.minPoolSize=1000
#初始化连接池大小
c3p0.initialPoolSize=1000
#最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 
c3p0.maxIdleTime=120

#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3
c3p0.acquireIncrement=10
#定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 
c3p0.acquireRetryAttempts=30
#两次连接中间隔时间,单位毫秒。Default: 1000 
c3p0.acquireRetryDelay=1000
#连接关闭时默认将所有未提交的操作回滚。Default: false  
c3p0.autoCommitOnClose=false
#----------------apache dbcp配置-----------------------
#<!-- 初始化连接 -->
dbcp.initialSize=15
#<!-- 最大空闲连接 -->
dbcp.maxIdle=10
#<!-- 最小空闲连接 -->
dbcp.minIdle=1
#最大连接数量
dbcp.maxActive=1000
#是否在自动回收超时连接的时候打印连接的超时错误
dbcp.logAbandoned=true
#是否自动回收超时连接
dbcp.removeAbandoned=true
#超时时间(以秒数为单位)
dbcp.removeAbandonedTimeout=300
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
dbcp.maxWait=3000
dbcp.testOnReturn=false
#set to 'SELECT 1' 
dbcp.validationQuery = "SELECT * from c3p0testtable" 
#set to 'true' 
dbcp.testWhileIdle = true  
#some positive integer 
dbcp.timeBetweenEvictionRunsMillis = 3000000  
#set to something smaller than 'wait_timeout' 
dbcp.minEvictableIdleTimeMillis = 3200000 
#if you don't mind a hit for every getConnection(), set to "true" 
dbcp.testOnBorrow = true 


#access date config ss
date=60000

#2


hibernate自带的连接池不足以支持大数据云状 需要借助第三方的dbcp或者c3p0连接池  

#3


BAE 明确不支持连接池啊,所以不能用第三方的

#1


换个连接池 换成c3p0 或者dbcp 连接池具体配置如下 可在网上查找补充
#----------c3p0配置
#最大的连接池大小
c3p0.maxPoolSize=20000
#最小的连接池大小
c3p0.minPoolSize=1000
#初始化连接池大小
c3p0.initialPoolSize=1000
#最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 
c3p0.maxIdleTime=120

#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3
c3p0.acquireIncrement=10
#定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 
c3p0.acquireRetryAttempts=30
#两次连接中间隔时间,单位毫秒。Default: 1000 
c3p0.acquireRetryDelay=1000
#连接关闭时默认将所有未提交的操作回滚。Default: false  
c3p0.autoCommitOnClose=false
#----------------apache dbcp配置-----------------------
#<!-- 初始化连接 -->
dbcp.initialSize=15
#<!-- 最大空闲连接 -->
dbcp.maxIdle=10
#<!-- 最小空闲连接 -->
dbcp.minIdle=1
#最大连接数量
dbcp.maxActive=1000
#是否在自动回收超时连接的时候打印连接的超时错误
dbcp.logAbandoned=true
#是否自动回收超时连接
dbcp.removeAbandoned=true
#超时时间(以秒数为单位)
dbcp.removeAbandonedTimeout=300
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
dbcp.maxWait=3000
dbcp.testOnReturn=false
#set to 'SELECT 1' 
dbcp.validationQuery = "SELECT * from c3p0testtable" 
#set to 'true' 
dbcp.testWhileIdle = true  
#some positive integer 
dbcp.timeBetweenEvictionRunsMillis = 3000000  
#set to something smaller than 'wait_timeout' 
dbcp.minEvictableIdleTimeMillis = 3200000 
#if you don't mind a hit for every getConnection(), set to "true" 
dbcp.testOnBorrow = true 


#access date config ss
date=60000

#2


hibernate自带的连接池不足以支持大数据云状 需要借助第三方的dbcp或者c3p0连接池  

#3


BAE 明确不支持连接池啊,所以不能用第三方的