V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jchnxu
V2EX  ›  程序员

jdbc 是个啥原理啊

  •  1
     
  •   jchnxu · 2022-09-22 07:14:47 +08:00 · 7405 次点击
    这是一个创建于 827 天前的主题,其中的信息可能已经有所发展或是发生改变。
    发现没有 jdbc 的 node.js 实现。我寻思这玩意不就是 tcp 连接么,为啥没人写一个
    第 1 条附言  ·  2022-09-22 12:51:50 +08:00
    原描述没太说清,我的意思,db connection 这一类的规范,其他语言为啥没有。找各种 driver 找起来就好麻烦
    第 2 条附言  ·  2022-09-22 21:28:51 +08:00
    环境限制条件是 electron + python cli ,能不用 jvm 最好
    48 条回复    2024-08-31 14:20:04 +08:00
    hefish
        1
    hefish  
       2022-09-22 07:21:57 +08:00   ❤️ 1
    node 来实现 jdbc ? 我感觉用 php 实现更快一些。
    debuggerx
        2
    debuggerx  
       2022-09-22 07:24:49 +08:00 via Android   ❤️ 33
    你猜 jdbc 的那个 j 是啥意思?
    KamenReborn
        3
    KamenReborn  
       2022-09-22 07:33:47 +08:00 via Android
    Java Database Connectivity
    liangkang1436
        4
    liangkang1436  
       2022-09-22 07:34:26 +08:00 via Android
    @debuggerx 哈哈哈哈
    panlatent
        5
    panlatent  
       2022-09-22 07:34:31 +08:00 via iPhone   ❤️ 2
    jdbc 抽调 node 的 d 再抽调 tcp 的 c 就只剩个 ..
    mikeguan
        6
    mikeguan  
       2022-09-22 07:38:32 +08:00 via Android   ❤️ 1
    大概率可以用 odbc
    Tink
        7
    Tink  
       2022-09-22 07:50:46 +08:00 via Android
    j
    chendy
        8
    chendy  
       2022-09-22 08:03:20 +08:00   ❤️ 3
    @debuggerx 是 javascript (确信
    neptuno
        9
    neptuno  
       2022-09-22 08:20:57 +08:00 via iPhone   ❤️ 1
    @debuggerx #2 javascript(逃
    fredcc
        10
    fredcc  
       2022-09-22 08:27:09 +08:00 via Android
    Javascript DataBase Connectivity 没问题
    bthulu
        11
    bthulu  
       2022-09-22 08:31:00 +08:00   ❤️ 2
    jdbc 的 j 难道不是 javascript 么?
    cweijan
        12
    cweijan  
       2022-09-22 08:38:57 +08:00
    jdbc 只是一套规范, 各种驱动实现的只是接口, 内部就是 tcp 连接
    jchnxu
        13
    jchnxu  
    OP
       2022-09-22 08:42:27 +08:00
    @mikeguan #6 感谢老哥,不过感觉 odbc 这玩意是不是特别好用,我跑半天跑不起来
    duanxianze
        15
    duanxianze  
       2022-09-22 08:54:30 +08:00   ❤️ 1
    xswl 加油吧新人
    kenvix
        16
    kenvix  
       2022-09-22 09:06:18 +08:00
    你用 ODBC 罢,真的
    jchnxu
        17
    jchnxu  
    OP
       2022-09-22 09:19:12 +08:00
    @wangtian2020 #14 我主要是想接 hive
    jchnxu
        18
    jchnxu  
    OP
       2022-09-22 09:21:54 +08:00
    @cweijan #12 是的。我就在想这玩意应该有人来出规范才对
    nba2k9
        19
    nba2k9  
       2022-09-22 09:31:09 +08:00
    万物皆可 JavaScript 重写
    Bromine0x23
        20
    Bromine0x23  
       2022-09-22 11:33:57 +08:00
    说来其他语言有类似 JDBC 的规范吗
    dqzcwxb
        21
    dqzcwxb  
       2022-09-22 11:36:59 +08:00
    java database connectivity,简称 jdbc
    L0L
        22
    L0L  
       2022-09-22 11:43:32 +08:00
    你可能不需要 jdbc
    lookStupiToForce
        23
    lookStupiToForce  
       2022-09-22 11:52:35 +08:00   ❤️ 1
    xswl 萌新很可爱
    jchnxu
        24
    jchnxu  
    OP
       2022-09-22 12:50:07 +08:00
    @L0L #22 我也是这么想的,我只是想连个 hive 而已

    - hive-driver 卡在 open-session ,包也不维护了
    - npm jdbc 卡在 jni_md.h ,也许是 $JAVA_HOME 的问题,也想到用户的电脑上可能这种问题更多
    - npm odbc 也没有跑起来

    我现在的想法是自己打一个 fat jar 然后命令行调用吧
    yinft
        25
    yinft  
       2022-09-22 15:01:11 +08:00
    @debuggerx 卧槽 哈哈哈
    debuggerx
        26
    debuggerx  
       2022-09-22 15:19:48 +08:00
    “找各种 driver 找起来就好麻烦”???
    https://cwiki.apache.org/confluence/display/Hive/HiveClient
    frisktale
        27
    frisktale  
       2022-09-22 15:22:21 +08:00
    别的我不知道,c#和 golang 都是有统一的 db connection 规范的
    sshang
        28
    sshang  
       2022-09-22 15:26:38 +08:00
    @jchnxu @Bromine0x23

    JDBC 全称叫 Java Database Connectivity ,是 Java 语言提供了一套用来访问数据库的 API 规范,具体来讲,可以理解为 java.sql 这个包。

    类似的,Python 也有 Python Database API Specification ( https://peps.python.org/pep-0249/)。
    qping
        29
    qping  
       2022-09-22 15:30:44 +08:00
    @jchnxu #17 hive 的 jdbc 驱动像一坨屎一样 依赖一堆的包
    ipwx
        30
    ipwx  
       2022-09-22 15:36:59 +08:00
    原因是 JDBC 其实是比“某个数据库的 Driver”更高一层的抽象,试图规范这个语言下的所有 DB Driver 接口。这需要强大的语言掌控力。Java 是个最初由 Sun 推动的商业型语言,所以 JDBC 出现了。

    如果某个语言需要,就需要有人牵头搞一个。但是很遗憾,JS/Python 这种社区型语言,你退出某个 Javascript XXX 别人也不买账。你看 npm 上各种包。。。

    ====

    其实 ORM 比 JDBC 封装层次更高,并不是要求各大 DB 遵守,而是反过来去适配各大 DB 的 driver 。ORM 才是更优解。
    Aloento
        31
    Aloento  
       2022-09-22 15:39:19 +08:00
    entity framework 表示很 j
    dcsuibian
        32
    dcsuibian  
       2022-09-22 15:59:15 +08:00
    是的,我之前也遇到过这个问题,没找到统一的上层接口。
    这样看来 Java 还真适合工程应用。
    ttwxdly
        33
    ttwxdly  
       2022-09-22 16:04:08 +08:00
    1
    hush3
        34
    hush3  
       2022-09-22 16:42:23 +08:00
    @debuggerx 🐔你太煤~ baby
    Mrzhs
        35
    Mrzhs  
       2022-09-22 16:49:26 +08:00
    @hush3 小黑子无处不在
    onice
        36
    onice  
       2022-09-22 17:34:08 +08:00
    jdbc ,开头的 j 是指的 java 。要想通用点,就用 odbc 吧。
    zoharSoul
        37
    zoharSoul  
       2022-09-22 18:42:43 +08:00
    @debuggerx #2 可能是 js, /狗头
    jchnxu
        38
    jchnxu  
    OP
       2022-09-22 21:10:49 +08:00
    @debuggerx #26 感谢老哥,我还真没想到要去找 hive 官网,因为同时在找其他的 db
    jchnxu
        39
    jchnxu  
    OP
       2022-09-22 21:14:47 +08:00
    @ipwx #30 有道理。

    我的原意是,实现本身应该不复杂,就怕有什么骚操作所以其他语言没有类似的东西。

    我想其实连接 db 无非就是 host, port, credentials, db 这些参数。然后弄一个连接池,如果是分布式的实现相应的协议。所以想当然以为所有语言都该有了。
    jchnxu
        40
    jchnxu  
    OP
       2022-09-22 21:15:20 +08:00
    fat jar 打出来了,python 的方案也跑通了,再次感谢大家!
    jchnxu
        41
    jchnxu  
    OP
       2022-09-22 21:16:51 +08:00
    @qping #29 是不是那个 thrift 协议的问题
    jchnxu
        42
    jchnxu  
    OP
       2022-09-22 21:23:14 +08:00
    @dcsuibian #32 后来咋解决的
    qping
        43
    qping  
       2022-09-22 21:42:08 +08:00
    @jchnxu #41 没有细看 它会引起各种 jar 包冲突 不过你应该不存在这个问题
    ys2016814
        44
    ys2016814  
       2022-09-22 22:00:47 +08:00
    SPI 服务提供发现机制
    cnbattle
        45
    cnbattle  
       2022-09-22 23:31:35 +08:00 via Android
    每个语言特性,语法,生态,各不相同,所以一个语言设计实现的库包,较难在别的语言有好的实现或应用
    ipwx
        46
    ipwx  
       2022-09-23 10:54:44 +08:00
    @jchnxu JDBC 其实是个很奇怪的抽象层。一方面它试图填补各个 DB driver 的差异性。但是 SQL 语言本身的差异性它又无法填补,就导致这玩意儿好像有点用,但其实毛用也没有,换个 DB 还得重写程序。毕竟所有语言的 DB driver 一般都能找得到完善的 connection pool 。

    所以真要跨数据库写代码还是得上 ORM 。比如 Python SQLAlchemy 。
    whileFalse
        47
    whileFalse  
       2022-09-23 13:13:27 +08:00 via iPhone
    jdbc 就是 java 搞面向对象搞魔怔了的结果,除了 jdbc 还有 servlet 。
    chaoschick
        48
    chaoschick  
       118 天前
    Node.js 中有多个库可以用于连接和操作数据库,最常用的包括以下几个:

    1. **MySQL**:
    - 使用 `mysql` 或 `mysql2` 库来连接 MySQL 数据库。
    - 示例:
    ```javascript
    const mysql = require('mysql2');

    const connection = mysql.createConnection({
    host: 'localhost',
    user: 'yourUsername',
    password: 'yourPassword',
    database: 'yourDatabase'
    });

    connection.connect(err => {
    if (err) {
    console.error('Error connecting to the database:', err);
    return;
    }
    console.log('Connected to the MySQL database.');
    });

    connection.query('SELECT * FROM yourTable', (err, results) => {
    if (err) {
    console.error('Error executing query:', err);
    return;
    }
    console.log('Query results:', results);
    });

    connection.end();
    ```

    2. **PostgreSQL**:
    - 使用 `pg` 库来连接 PostgreSQL 数据库。
    - 示例:
    ```javascript
    const { Client } = require('pg');

    const client = new Client({
    host: 'localhost',
    user: 'yourUsername',
    password: 'yourPassword',
    database: 'yourDatabase'
    });

    client.connect(err => {
    if (err) {
    console.error('Error connecting to the database:', err);
    return;
    }
    console.log('Connected to the PostgreSQL database.');
    });

    client.query('SELECT * FROM yourTable', (err, res) => {
    if (err) {
    console.error('Error executing query:', err);
    return;
    }
    console.log('Query results:', res.rows);
    });

    client.end();
    ```

    3. **SQLite**:
    - 使用 `sqlite3` 库来连接 SQLite 数据库。
    - 示例:
    ```javascript
    const sqlite3 = require('sqlite3').verbose();

    const db = new sqlite3.Database('./yourDatabase.db');

    db.serialize(() => {
    db.each('SELECT * FROM yourTable', (err, row) => {
    if (err) {
    console.error('Error executing query:', err);
    return;
    }
    console.log('Row:', row);
    });
    });

    db.close();
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   959 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:03 · PVG 04:03 · LAX 12:03 · JFK 15:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.