如何用TypeScript连接Apache Ignite?遇超时错误,求适配库及JDBC驱动方案
连接Apache Ignite数据库的问题与解决方案
问题场景
尝试通过mysql库编写TypeScript代码连接Apache Ignite数据库,代码如下:
import * as mysql from 'mysql'; async function connectAndQueryDatabase(): Promise<void> { // Database connection configuration const connection = mysql.createConnection({ host: '10.10.10.10', database: 'DBNAME' }); try { await new Promise<void>((resolve, reject) => { connection.connect((err) => { if (err) { reject(err); return; } console.log('Connected to database'); resolve(); }); }); const queryResults = await new Promise<any>((resolve, reject) => { connection.query('SELECT * FROM TABLE', (err, results, fields) => { if (err) { reject(err); return; } resolve(results); }); }); console.log('Query results:', queryResults); } catch (error) { console.error('Error:', error); } finally { await new Promise<void>((resolve, reject) => { connection.end((err) => { if (err) { reject(err); return; } console.log('Database connection closed'); resolve(); }); }); }} // Call the function to connect and query the database connectAndQueryDatabase();
运行后出现超时错误:
errno: 'ETIMEDOUT', code: 'ETIMEDOUT', syscall: 'connect', fatal: true
不确定应该使用哪个库连接(SQL客户端仅需URL即可连接),询问是否有可用的JDBC驱动来创建数据库连接。
解决方案
为什么mysql库会失败?
Ignite虽支持MySQL兼容协议,但默认未开启该连接器,且mysql库是针对MySQL开发的,并非Ignite官方适配库。超时大概率是因为Ignite节点未开启MySQL兼容端口(默认3306),或网络/防火墙阻止了连接。更稳妥的方式是使用Ignite官方支持的客户端或JDBC方案。
方案1:使用Ignite官方Node.js客户端
这是最推荐的方式,官方提供的apache-ignite-client库专门用于Node.js环境连接Ignite:
- 安装依赖:
npm install apache-ignite-client
- TypeScript代码示例:
import { IgniteClient, IgniteClientConfiguration, SqlQuery } from 'apache-ignite-client'; async function connectAndQuery() { const client = new IgniteClient(); try { // 连接Ignite集群(默认thin客户端端口10800) await client.connect(new IgniteClientConfiguration('10.10.10.10:10800')); // 执行SQL查询 const sqlQuery = new SqlQuery('TABLE', 'SELECT * FROM TABLE'); const results = await client.query(sqlQuery).getAll(); console.log('查询结果:', results); } catch (error) { console.error('连接或查询出错:', error); } finally { // 断开连接 client.disconnect(); } } connectAndQuery();
方案2:使用JDBC驱动(Node.js环境)
如果偏好JDBC方式,可以通过jdbc库在Node.js中调用Ignite的JDBC驱动:
- 安装依赖:
npm install jdbc java
- 下载Ignite的JDBC驱动包(如
ignite-core.jar、ignite-jdbc.jar),放到项目目录下 - TypeScript代码示例:
import { JDBC } from 'jdbc'; async function connectViaJDBC() { const config = { libpath: ['./ignite-core.jar', './ignite-jdbc.jar'], // 替换为实际jar包路径 drivername: 'org.apache.ignite.IgniteJdbcDriver', url: 'jdbc:ignite:thin://10.10.10.10:10800/DBNAME' // Ignite Thin JDBC URL }; const jdbc = new JDBC(config); try { await jdbc.initialize(); const conn = await jdbc.reserve(); // 执行查询 const results = await conn.query('SELECT * FROM TABLE'); console.log('查询结果:', results); await jdbc.release(conn); } catch (error) { console.error('JDBC连接出错:', error); } finally { await jdbc.close(); } } connectViaJDBC();
超时问题排查要点
- 确认Ignite节点的IP和端口可达:thin客户端默认端口10800,MySQL兼容端口默认3306,需检查Ignite配置文件中是否开启了对应连接器
- 检查防火墙/安全组是否允许目标端口的入站访问
- 确认Ignite集群处于正常运行状态
内容的提问来源于stack exchange,提问作者Pradap Pandian
相关产品推荐
相关产品推荐

