You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中创建H2数据库表失败,查询提示表不存在求助

问题分析与修复

你的代码里有几个关键问题导致表创建失败或者查询时机不对:

1. 异步操作未按顺序执行

h2.initialize是异步方法,但你直接调用test(),这时候数据库连接池可能还没初始化完成,后续的创建表、插入、查询操作都会因为连接问题失败。同时init、addSome、getAll都是异步操作,你直接依次调用会让它们并行执行,查询操作可能在表创建完成前就执行了,自然找不到表。

2. INSERT语句语法错误

你的插入SQL写法有误,多个值的正确格式是values(1),(2),(3),(4),(5),而不是多次写values()。

3. 错误处理缺失

代码里很多异步操作的错误没有捕获和输出,比如创建表失败、插入失败的错误信息都没打印,导致你看不到问题所在。

修复后的代码

var JDBC = require('jdbc');
var jinst = require('jdbc/lib/jinst');
var config = {
    url: 'jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=3;ACCESS_MODE_DATA=rw;DATABASE_TO_UPPER=false',
    drivername: 'org.h2.Driver', 
    minpoolsize: 10,
    maxpoolsize: 100,
};

if (!jinst.isJvmCreated()) {
    jinst.addOption("-Xrs");
    jinst.setupClasspath(['./lib/h2-2.1.214.jar']);
}

var h2 = new JDBC(config);

// 先等初始化完成再执行后续操作
h2.initialize((err) => {
    if (err) {
        console.log('initialize.error:', err);
        return;
    }
    console.log('h2 initialized:', h2);
    test(); // 初始化完成后再调用test
});

function queryDB(sql, callback) {
    h2.reserve((err, connobj) => {
        if (err) {
            console.log('reserve connection error:', err);
            return callback?.(err);
        }
        if (!connobj || !connobj.conn) {
            console.log('error excuting query: no connection');
            return callback?.(new Error('no connection available'));
        }
        connobj.conn.createStatement((err, statement) => {
            if (err) {
                console.log('create statement error:', err);
                h2.release(connobj);
                return callback?.(err);
            }
            if (callback) {
                statement.executeQuery(sql, (err, result) => {
                    h2.release(connobj, (releaseErr) => {
                        if (releaseErr) console.log('release connection error:', releaseErr);
                        callback(err, result);
                    });
                });
            } else {
                statement.executeUpdate(sql, (err) => {
                    h2.release(connobj, (releaseErr) => {
                        if (releaseErr) console.log('release connection error:', releaseErr);
                        if (err) console.log('execute update error:', err);
                    });
                });
            }
        });
    });
};

// 给init、addSome加上回调,保证顺序执行
function init(callback) {
    queryDB("CREATE TABLE IDS_TABLE (ID_COL int)", callback);
}

function addSome(callback) {
    // 修正INSERT语法
    queryDB("insert into IDS_TABLE(ID_COL) values(1),(2),(3),(4),(5)", callback);
}

function getAll(callback) {
    queryDB("SELECT ID_COL FROM IDS_TABLE", (err, result) => {
        if (err) {
            console.log('query error:', err);
            return callback?.(err);
        }
        console.log('result: ', result);
        callback?.(null, result);
    });
}

function test() {
    // 用回调链保证顺序:先建表,再插入,最后查询
    init((err) => {
        if (err) return;
        addSome((err) => {
            if (err) return;
            getAll();
        });
    });
}

关键修复点说明

  • 把test()放在h2.initialize的回调里,确保数据库连接池初始化完成后再执行操作。
  • 给init、addSome添加回调参数,通过回调链保证操作顺序:建表完成后再插入,插入完成后再查询。
  • 修正INSERT语句的语法错误。
  • 补充所有异步步骤的错误处理,方便排查问题。
  • 在queryDB里完善连接释放和错误回调,避免资源泄漏。

内容的提问来源于stack exchange,提问作者User User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:27:36