【问题标题】:Connecting to H2 server from DbVisualizer从 DbVisualizer 连接到 H2 服务器
【发布时间】:2015-07-29 01:48:54
【问题描述】:

我的 H2 数据库配置如下:

@Configuration
@Profile({ Profiles.DEV })
public class DevDataSourceConfiguration {

    @Bean(initMethod = "start", destroyMethod = "stop")
    public Server h2WebServer() throws SQLException {
        return Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082");
    }

    @Bean(initMethod = "start", destroyMethod = "stop")
    @DependsOn("h2WebServer")
    public Server h2Server() throws SQLException {
        return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092");
    }

    @Bean
    @DependsOn("h2Server")
    public DataSource datasource() {
        HikariDataSource ds = new HikariDataSource();
        ds.setDriverClassName("org.h2.Driver");
        ds.setJdbcUrl("jdbc:h2:tcp://localhost/~/bignibou");
        return ds;
    }
}

我现在尝试使用以下 jdbc URL 从 DBVisualizer 访问我的数据库:jdbc:h2:tcp://localhost/~/bignibou,我在 dbvis 日志中收到以下错误:

2015-05-17 17:02:24.544 WARN   595 [ExecutorRunner-pool-3-thread-11 - G.ᅣテ] Could not setAutoCommit(true) for: bignibou
org.h2.jdbc.JdbcSQLException: Connection is broken: "unexpected status 16777216" [90067-176]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
    at org.h2.message.DbException.get(DbException.java:178)
    at org.h2.message.DbException.get(DbException.java:154)
    at org.h2.engine.SessionRemote.done(SessionRemote.java:621)
    at org.h2.command.CommandRemote.prepare(CommandRemote.java:69)
    at org.h2.command.CommandRemote.<init>(CommandRemote.java:46)
    at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:476)
    at org.h2.engine.SessionRemote.setAutoCommitSend(SessionRemote.java:243)
    at org.h2.engine.SessionRemote.setAutoCommit(SessionRemote.java:210)
    at org.h2.jdbc.JdbcConnection.setAutoCommit(JdbcConnection.java:431)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.onseven.dbvis.h.B.C.ᅣチ(Z:2206)
    at com.onseven.dbvis.h.B.F$A.call(Z:2515)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
2015-05-17 17:02:24.546 INFO   595 [ExecutorRunner-pool-3-thread-11 - AbstractFacade.getCatalog] Could not getCatalog for: bignibou
org.h2.jdbc.JdbcSQLException: Connection is broken: "unexpected status 16777216" [90067-176]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
    at org.h2.message.DbException.get(DbException.java:178)
    at org.h2.message.DbException.get(DbException.java:154)
    at org.h2.engine.SessionRemote.done(SessionRemote.java:621)
    at org.h2.command.CommandRemote.prepare(CommandRemote.java:69)
    at org.h2.command.CommandRemote.<init>(CommandRemote.java:46)
    at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:476)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
    at org.h2.jdbc.JdbcConnection.getCatalog(JdbcConnection.java:598)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.onseven.dbvis.h.B.C.ᅣチ(Z:2206)
    at com.onseven.dbvis.h.B.F$A.call(Z:2515)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

edit:这是我将;trace_level_system_out=3添加到连接url后得到的日志输出:

2015-05-26 12:25:13.601 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/Connection conn1 = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/bignibou;trace_level_system_out=3", "", "");
2015-05-26 12:25:13.602 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/DatabaseMetaData dbMeta1 = conn1.getMetaData();
2015-05-26 12:25:13.602 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/conn1.setAutoCommit(true);
2015-05-26 12:25:13.602 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: SESSION_PREPARE_READ_PARAMS 0
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: exception
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush] org.h2.jdbc.JdbcSQLException: Connection is broken: "unexpected status 16777216" [90067-176]
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.message.DbException.get(DbException.java:178)
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.message.DbException.get(DbException.java:154)
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.engine.SessionRemote.done(SessionRemote.java:621)
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.command.CommandRemote.prepare(CommandRemote.java:69)
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.command.CommandRemote.<init>(CommandRemote.java:46)
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:476)
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.engine.SessionRemote.setAutoCommitSend(SessionRemote.java:243)
2015-05-26 12:25:13.603 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.engine.SessionRemote.setAutoCommit(SessionRemote.java:210)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.jdbc.JdbcConnection.setAutoCommit(JdbcConnection.java:431)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at java.lang.reflect.Method.invoke(Method.java:497)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at com.onseven.dbvis.h.B.C.ᅣチ(Z:2206)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at com.onseven.dbvis.h.B.F$A.call(Z:2515)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
2015-05-26 12:25:13.604 INFO   159 [pool-3-thread-8 - Q.flush]  at java.lang.Thread.run(Thread.java:745)
2015-05-26 12:25:13.604 WARN   159 [ExecutorRunner-pool-2-thread-2 - G.ᅣテ] Could not setAutoCommit(true) for: bignibou
org.h2.jdbc.JdbcSQLException: Connection is broken: "unexpected status 16777216" [90067-176]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
    at org.h2.message.DbException.get(DbException.java:178)
    at org.h2.message.DbException.get(DbException.java:154)
    at org.h2.engine.SessionRemote.done(SessionRemote.java:621)
    at org.h2.command.CommandRemote.prepare(CommandRemote.java:69)
    at org.h2.command.CommandRemote.<init>(CommandRemote.java:46)
    at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:476)
    at org.h2.engine.SessionRemote.setAutoCommitSend(SessionRemote.java:243)
    at org.h2.engine.SessionRemote.setAutoCommit(SessionRemote.java:210)
    at org.h2.jdbc.JdbcConnection.setAutoCommit(JdbcConnection.java:431)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.onseven.dbvis.h.B.C.ᅣチ(Z:2206)
    at com.onseven.dbvis.h.B.F$A.call(Z:2515)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
2015-05-26 12:25:13.605 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/conn1.isClosed();
2015-05-26 12:25:13.605 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/conn1.getAutoCommit();
2015-05-26 12:25:13.608 INFO   159 [ExecutorRunner-pool-2-thread-2 - Q.flush] 05-26 12:25:13 jdbc: 
/**/dbMeta1.getSearchStringEscape();
2015-05-26 12:25:13.608 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/conn1.isClosed();
2015-05-26 12:25:13.608 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/conn1.getAutoCommit();
2015-05-26 12:25:13.608 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/conn1.getCatalog();
2015-05-26 12:25:13.608 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: SESSION_PREPARE_READ_PARAMS 1
2015-05-26 12:25:13.608 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: exception
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush] org.h2.jdbc.JdbcSQLException: Connection is broken: "unexpected status 16777216" [90067-176]
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.message.DbException.get(DbException.java:178)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.message.DbException.get(DbException.java:154)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.engine.SessionRemote.done(SessionRemote.java:621)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.command.CommandRemote.prepare(CommandRemote.java:69)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.command.CommandRemote.<init>(CommandRemote.java:46)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:476)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at org.h2.jdbc.JdbcConnection.getCatalog(JdbcConnection.java:598)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at java.lang.reflect.Method.invoke(Method.java:497)
2015-05-26 12:25:13.609 INFO   159 [pool-3-thread-8 - Q.flush]  at com.onseven.dbvis.h.B.C.ᅣチ(Z:2206)
2015-05-26 12:25:13.610 INFO   159 [pool-3-thread-8 - Q.flush]  at com.onseven.dbvis.h.B.F$A.call(Z:2515)
2015-05-26 12:25:13.610 INFO   159 [pool-3-thread-8 - Q.flush]  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2015-05-26 12:25:13.610 INFO   159 [pool-3-thread-8 - Q.flush]  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
2015-05-26 12:25:13.610 INFO   159 [pool-3-thread-8 - Q.flush]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
2015-05-26 12:25:13.610 INFO   159 [pool-3-thread-8 - Q.flush]  at java.lang.Thread.run(Thread.java:745)
2015-05-26 12:25:13.610 INFO   159 [ExecutorRunner-pool-2-thread-2 - AbstractFacade.getCatalog] Could not getCatalog for: bignibou
org.h2.jdbc.JdbcSQLException: Connection is broken: "unexpected status 16777216" [90067-176]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
    at org.h2.message.DbException.get(DbException.java:178)
    at org.h2.message.DbException.get(DbException.java:154)
    at org.h2.engine.SessionRemote.done(SessionRemote.java:621)
    at org.h2.command.CommandRemote.prepare(CommandRemote.java:69)
    at org.h2.command.CommandRemote.<init>(CommandRemote.java:46)
    at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:476)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
    at org.h2.jdbc.JdbcConnection.getCatalog(JdbcConnection.java:598)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.onseven.dbvis.h.B.C.ᅣチ(Z:2206)
    at com.onseven.dbvis.h.B.F$A.call(Z:2515)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
2015-05-26 12:25:13.611 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/conn1.isClosed();
2015-05-26 12:25:13.611 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/conn1.getAutoCommit();
2015-05-26 12:25:13.611 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/Statement stat1 = conn1.createStatement();
2015-05-26 12:25:13.611 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: 
/**/ResultSet rs1 = stat1.executeQuery("call schema()");
2015-05-26 12:25:13.611 INFO   159 [pool-3-thread-8 - Q.flush] 05-26 12:25:13 jdbc: SESSION_PREPARE_READ_PARAMS 2

edit 2:我也注意到了这一点(在应用程序控制台日志中):

05-26 12:25:13 database: connecting session #14 to /Users/julien/bignibou
05-26 12:25:13 jdbc[14]: 
/*SQL */SET TRACE_LEVEL_SYSTEM_OUT 3;
05-26 12:29:04 jdbc[13]: 
/*SQL */ROLLBACK;
05-26 12:29:04 jdbc[14]: 
/*SQL */ROLLBACK;
05-26 12:29:04 database: disconnecting session #14
05-26 12:29:04 database: disconnected session #14
05-26 12:29:04 database: disconnecting session #13
05-26 12:29:04 database: disconnected session #13

【问题讨论】:

  • 临时将“;trace_level_system_out=3”附加到数据库 URL 可能有助于调试目的
  • HI AydinK:我已经编辑了我的帖子。
  • DBVisualizer 是用 Java 实现的。你能通过普通的旧 jdbc 连接到数据库吗?
  • 是的,我正在使用 jdbc 连接到数据库。我认为这是使用 dbvis 的唯一方法。
  • 我注意到两件事:显然在设置 auto_commit 连接参数时引发了异常,并且您显然正在将 tcp 与连接字符串中的本地访问混合。尝试将连接字符串更改为 jdbc:h2:tcp://localhost:9092。

标签: h2 dbvisualizer


【解决方案1】:

我有同样的问题。我从http://h2database.com 安装了 H2,并且 grails 应用程序正在抛出:

[localhost-startStop-1] ERROR StackTrace  - Full Stack Trace:
org.h2.jdbc.JdbcSQLException: Connection is broken: "java.net.ConnectException: Connection refused: connect: localhost" [90067-176]

事实证明,我的 H2 服务器版本是 1.4.196,我将 1.3.176 作为 grails 依赖项加载。我已更新 BuildConfig.groovy 以使其工作:

dependencies {
    ...
    test "org.grails:grails-datastore-test-support:1.0.2-grails-2.4"
    runtime "com.h2database:h2:1.4.196"
}

【讨论】:

    【解决方案2】:
    • 最新的 H2 稳定版本:1.3.176。
    • 最新的 dbVisualizer H2 驱动程序:1.3.176。

    您可能正在使用 H2 (1.4.x) 的 beta 版本,在客户端/服务器通信中存在一些错误(版本不匹配应该不是问题,因为客户端和服务器协商使用哪个协议版本)尝试使用H2 的最新 beta 版本或使用 H2 的最新稳定版本。

    【讨论】:

    • 就是这样:我只需要从 1.4.xx 更改为 1.3.176,现在就可以正常工作了。
    【解决方案3】:

    检查您在 DBVisualizer 中使用的 h2 JDBC 驱动程序的版本。具体来说,检查是否与您在服务器上使用的版本匹配。虽然版本匹配通常无关紧要,但不久​​前 H2 存在问题,在使用不匹配的版本时会导致此类错误。

    如果这没有帮助,您可能还想准确报告您在客户端和服务器上使用的 H2 版本。

    【讨论】:

    • 它很脆。如果 H2 JDBC 驱动程序与服务器端的驱动程序不匹配,则您会收到错误消息“连接断开:”“意外状态 16777216”。这是一条神秘的错误信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2018-12-20
    相关资源
    最近更新 更多