V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tctc4869
V2EX  ›  Java

现在后端编写的功能代码,一个功能代码中,一般会有多少次调用 jdbc 访问数据库?

  •  
  •   tctc4869 · 2020-03-25 11:59:22 +08:00 · 3515 次点击
    这是一个创建于 1710 天前的主题,其中的信息可能已经有所发展或是发生改变。

    传统企业的如银行金融,他们的网络软件功能的访问数据库,听说基本是存储过程写好,程序员只需要调用一次就行了。 后来互联网企业出现了,不倡导,甚至禁止用数据库自带的组件,例如存储过程,触发器,游标一类,阿里云就是这么一个例子,既然不能用存储过程封装 sql 语句了,那么为了开发方便,就得用 orm 框架了,最开始是 hibernate,但重,学习成本高,然后是 mybatis 。但 mybatis 是半自动 orm 框架。除了封装 jdbc 大部分操作,还有管理 sql 语句模板的功能。后来的 orm 框架基本有这两个框架的影子,要么就是类似.net linq 那一套。

    各位程序员们写负责功能 Controller 类代码时候,写一个接受请求的方法,各位写的请求接受代码里,所编写的编写的代码里,最多会出现多少次 jdbc 链接次数?

    那么问题来了,我担心的是一个功能连数据库的次数较多,并发起来叠加会不会出现什么奇怪的问题?数据库死锁?还是其他的什么? 编写一个功能代码,jdbc 访问数据库弄成一次,还是多次?(类似 Spring mvc 那种拦截器权限验证和用户日志记录不算),如果弄成一次,各位是写存储过程封装,还是把 sql 语句丢到类似 mybatis 框架的 sql 模板文件里?还是大家为了开发方便和规范,大部分是用类似 tk.mybatis 或者是 JPA 之类的 orm 框架,都是超过 2 次以上的多次调用 jdbc 访问数据库,只有特复杂的,才会写 sql 语句用 mybatis 管理。是这样的吗?

    17 条回复    2020-03-28 11:33:46 +08:00
    gz911122
        1
    gz911122  
       2020-03-25 12:06:44 +08:00
    不写存储过程,
    业务需要几次调用就几次调用,纠结这个干嘛
    opengps
        2
    opengps  
       2020-03-25 12:14:32 +08:00 via Android
    各有各的场景,提倡不提倡都是有场景前提的。
    银行用的起大厂正版服务,而且模式相对固定,用了存储过程可能也无妨。
    企业年年都有新的方向,数据库需要简化到最原始的读写上去,靠程序来实现调度,所以提倡精简
    企业比较就行采用云架构来开发,原因在于部署集群可大可小,方便及时不动代码就单纯通过运维通过机器数量配置来调节系统承载力
    hantsy
        3
    hantsy  
       2020-03-25 14:22:30 +08:00
    JPA 查询可以缓存的。
    zivyou
        4
    zivyou  
       2020-03-25 14:32:49 +08:00   ❤️ 2
    手边有个项目,之前为了减少查询次数,在数据库表上建立了很多关联关系,然后大量使用 join 去查询。
    后来各方需求发生了变化,才理解这种设计很蠢。不仅效率低,而且难扩展。
    所以现在我倾向于「宁愿多查几次」,而不是企图「查一次解决问题」
    wysnylc
        5
    wysnylc  
       2020-03-25 15:14:59 +08:00
    迷惑发言,一碗饭里有多少粒米?
    xiangyuecn
        6
    xiangyuecn  
       2020-03-25 15:29:48 +08:00
    select * from V2EX WITH(UPDLOCK) where t=655985

    select * from V2EX where t=655985 FOR UPDATE

    优雅的加个锁
    lix7
        7
    lix7  
       2020-03-25 15:31:17 +08:00   ❤️ 1
    连接都是连接池复用的,连接不够自然就排队了,不会出现你说的并发叠加什么的。而且死锁不是这个意思的。
    现实情况是,该调多少就调多少,除了明显犯蠢,不用想太多。
    zunceng
        8
    zunceng  
       2020-03-25 15:56:35 +08:00
    我用 mysql driver 不用 jdbc 所以是 0 次
    Rheinmetal
        9
    Rheinmetal  
       2020-03-25 16:23:25 +08:00
    存储过程的负载不一定小哦 不用它是业务性质问题 调试存储过程难度太高 银行写一次用很多年 自然可以搞 业务一个月变几次 存储过程就难受了
    timbotetsu
        10
    timbotetsu  
       2020-03-25 17:21:40 +08:00
    @zunceng 大神👍
    zr8657
        11
    zr8657  
       2020-03-25 17:25:13 +08:00
    有幸见识过 3 层 for 循环调数据库的
    l641437123
        12
    l641437123  
       2020-03-25 17:29:08 +08:00
    很迷惑,连接数你有连接池来管理,看你集群的规模
    sumarker
        13
    sumarker  
       2020-03-25 17:37:49 +08:00
    这个要看连接池的配置吧?
    gscoder
        14
    gscoder  
       2020-03-25 21:55:05 +08:00
    互联网行业一般严禁使用存储过程
    littlewing
        15
    littlewing  
       2020-03-26 01:19:59 +08:00 via iPhone
    你是用的短链接,每次查询新建一个数据库连接?
    ymz
        16
    ymz  
       2020-03-27 09:32:17 +08:00
    @zr8657 这个牛逼死了
    tctc4869
        17
    tctc4869  
    OP
       2020-03-28 11:33:46 +08:00
    如果一个功能要展示多个实体的数据在一个区域上,各位会是怎么弄呢,是写个复杂的带 join 的 sql,还是其他的方法?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   936 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:44 · PVG 05:44 · LAX 13:44 · JFK 16:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.