通过JDBC创建PostgreSQL数据库后无法连接,报错数据库不存在
问题
我希望通过JDBC创建一个新的PostgreSQL数据库并直接使用,但创建后新数据库无法正常被识别,无法建立新连接。测试实现代码如下:
String url = "jdbc:postgresql://host.docker.internal:54688/"; String username = "postgres"; String password = "..."; try (Connection connObj = DriverManager.getConnection(url, username, password); Statement stmtObj = connObj.createStatement();) { connObj.setAutoCommit(true); stmtObj.execute("CREATE DATABASE testdb"); } catch (SQLException e) { fail(); } String newDbUrl = url + "testdb"; try (Connection newConnection = DriverManager.getConnection(newDbUrl, username, password); Statement newStatement = newConnection.createStatement()) { newStatement.executeUpdate("CREATE TABLE mytable (id serial primary key, name varchar)"); } catch (SQLException e1) { fail(); // <--------- Always fail here }
代码总会触发第二个SQLException,错误信息为:org.postgresql.util.PSQLException: FATAL: database "testdb" does not exist。在DBeaver中,只有激活“显示所有数据库”选项才能看到testdb。请问我哪里操作有误?
解答
问题根源
- 初始URL未明确指定数据库:初始连接URL末尾仅为
/,PostgreSQL JDBC驱动会默认尝试连接与用户名同名的数据库(此处为postgres),虽能成功创建testdb,但后续连接新数据库时,可能因驱动内部缓存或连接状态残留导致识别延迟。 - Docker环境的文件系统同步延迟:数据库运行在Docker容器中时,
CREATE DATABASE执行完成后,容器内文件系统需要短暂时间完成新数据库目录的同步,立即连接会出现数据库未就绪的情况。 - DBeaver显示设置的误导:DBeaver默认仅显示当前连接的数据库,开启“显示所有数据库”才能看到
testdb是工具自身的逻辑,和数据库是否真实存在无关,无需调整数据库配置。
修复方案
- 明确指定初始连接的数据库:将初始URL修改为
jdbc:postgresql://host.docker.internal:54688/postgres,避免驱动默认行为带来的不确定性。 - 添加短暂延迟后再连接新数据库:在创建数据库和尝试连接之间加入几秒延迟,给Docker容器足够时间完成初始化,示例代码:
// 创建数据库后添加2秒延迟,可根据实际情况调整 Thread.sleep(2000); - 先验证数据库创建状态:在创建数据库后,立即在初始连接中执行查询确认数据库存在,再尝试新连接:
ResultSet rs = stmtObj.executeQuery("SELECT datname FROM pg_database WHERE datname = 'testdb'"); if (!rs.next()) { fail("数据库testdb未创建成功"); }
内容的提问来源于stack exchange,提问作者Dackelkotze
相关产品推荐
相关产品推荐

