Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JdbcSQLNonTransientConnectionException:数据库可能已在使用中:";等待数据库关闭的时间超过1分钟”;_Java_H2 - Fatal编程技术网

Java JdbcSQLNonTransientConnectionException:数据库可能已在使用中:";等待数据库关闭的时间超过1分钟”;

Java JdbcSQLNonTransientConnectionException:数据库可能已在使用中:";等待数据库关闭的时间超过1分钟”;,java,h2,Java,H2,我们使用H2启动作为数据库服务器进程,并在标准TCP/IP端口9092上侦听 我们的应用程序使用连接池部署在Tomcat中。我们在空闲时间进行吹扫,最终导致所有H2连接关闭。当应用程序再次尝试打开与H2的连接时,我们会不时观察到错误: SCHEDULERSERVICE schedule: Exception: Database may be already in use: "Waited for database closing longer than 1 minute".

我们使用H2启动作为数据库服务器进程,并在标准TCP/IP端口9092上侦听

我们的应用程序使用连接池部署在Tomcat中。我们在空闲时间进行吹扫,最终导致所有H2连接关闭。当应用程序再次尝试打开与H2的连接时,我们会不时观察到错误:

SCHEDULERSERVICE schedule: Exception: Database may be already in use: "Waited for database closing longer than 1 minute". Possible solutions: close all other connection(s); use the server mode [90020-199]
org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database may be already in use: "Waited for database closing longer than 1 minute". Possible solutions: close all other connection(s); use the server mode [90020-199]
       at org.h2.message.DbException.getJdbcSQLException(DbException.java:617)
       at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
       at org.h2.message.DbException.get(DbException.java:205)
       at org.h2.message.DbException.get(DbException.java:181)
       at org.h2.engine.Engine.openSession(Engine.java:209)
       at org.h2.engine.Engine.createSessionAndValidate(Engine.java:178)
       at org.h2.engine.Engine.createSession(Engine.java:161)
       at org.h2.server.TcpServerThread.run(TcpServerThread.java:160)
       at java.lang.Thread.run(Thread.java:748)

       at org.h2.message.DbException.getJdbcSQLException(DbException.java:617)
       at org.h2.engine.SessionRemote.done(SessionRemote.java:607)
       at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:143)
       at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:431)
       at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:317)
       at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:169)
       at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:148)
       at org.h2.Driver.connect(Driver.java:69)
       at java.sql.DriverManager.getConnection(DriverManager.java:664)
SCHEDULERSERVICE时间表:异常:数据库可能已在使用:“等待数据库关闭的时间超过1分钟”。可能的解决方案:关闭所有其他连接;使用服务器模式[90020-199]
org.h2.jdbc.jdbcsqlnontransionconnectionexception:数据库可能已在使用:“等待数据库关闭的时间超过1分钟”。可能的解决方案:关闭所有其他连接;使用服务器模式[90020-199]
位于org.h2.message.DbException.getJdbcSQLException(DbException.java:617)
位于org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
位于org.h2.message.DbException.get(DbException.java:205)
位于org.h2.message.DbException.get(DbException.java:181)
位于org.h2.engine.engine.openSession(engine.java:209)
位于org.h2.engine.engine.createSessionAndValidate(engine.java:178)
位于org.h2.engine.engine.createSession(engine.java:161)
位于org.h2.server.TcpServerThread.run(TcpServerThread.java:160)
运行(Thread.java:748)
位于org.h2.message.DbException.getJdbcSQLException(DbException.java:617)
位于org.h2.engine.SessionRemote.done(SessionRemote.java:607)
位于org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:143)
位于org.h2.engine.SessionRemote.connectServer(SessionRemote.java:431)
位于org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:317)
JdbcConnection(JdbcConnection.java:169)
JdbcConnection(JdbcConnection.java:148)
位于org.h2.Driver.connect(Driver.java:69)
位于java.sql.DriverManager.getConnection(DriverManager.java:664)
当Tomcat连接池关闭所有空闲连接(未使用)并且之后关闭一个仍在使用的连接时,就会出现问题

下一次尝试打开新连接失败,等待一段时间后重试成功

  • 在什么情况下会发生这种例外情况
  • 例外是什么意思
  • 有什么建议可以避免这个问题吗
在我看来,H2在最后一个连接关闭后会关闭数据库

  • 数据库何时关闭
  • 如何控制数据库关闭
提前Thx
Thorsten

web应用程序中的嵌入式数据库需要仔细处理其生命周期

您可以添加一个
javax.servlet.ServletContextListener
实现(用
@WebListener
注释标记或包含在
web.xml
中),并将显式数据库关闭添加到其
contextDestroyed()
方法中

您可以在这里使用
connection.createStatement().execute(“shutdown”)
强制关闭数据库。若您的应用程序需要在卸载期间向数据库写入一些内容,那个么它应该在该命令之前完成

如果没有显式关闭,H2会在所有连接关闭时关闭数据库,如果没有显式配置其他行为(例如,使用JDBCURL中的参数)。例如,
DB\u CLOSE\u DELAY
设置额外的延迟,可能您的应用程序使用该设置,因此H2不会立即关闭数据库,或者应用程序不会立即关闭所有连接

无论如何,当您试图更新fly的web应用程序时,Tomcat会在卸载旧版本之前尝试初始化新版本。如果H2位于web应用程序本身的类路径中,则新版本将无法在新版本已联机但旧版本尚未卸载的短时间内连接到数据库

如果您不喜欢它,您可以运行独立的H2服务器进程,并在web应用程序中使用到它的远程连接

另一种选择是将H2移动到Tomcat本身的类路径,并将连接池配置为
server.xml
中的资源,在这种情况下,它不应受到应用程序生命周期的影响

在这两种情况下,都不应使用
SHUTDOWN
命令


已更新

对于客户端-服务器到远程服务器的连接,这种异常意味着服务器决定关闭数据库,因为没有活动连接。此操作不能中断,并在中间恢复。在此过程中,尝试打开与同一数据库的新连接时,它最多会等待1分钟,等待此过程完成后重新打开数据库。此超时不可配置

有两种可能的解决办法

  • DB\u CLOSE\u DELAY
    设置可以在几秒钟内与一些较大的值一起使用。当所有连接都关闭时,数据库将在指定的秒数内保持联机<代码>-1也可用于设置无限超时

  • 您可以尝试加快关机过程,但您必须自己弄清楚是什么花费了这么多时间。默认情况下,文件压缩过程限制为200毫秒,这可能需要更长的时间,但我认为不会太长。可能您有很多临时对象或未提交的数据。可能您的数据库文件碎片很高。没有进一步的调查,很难说到底出了什么问题


  • web应用程序中的嵌入式数据库需要仔细处理其生命周期

    您可以添加一个
    javax.servlet.ServletContextListener
    implementat