JAVA后端实际开发中碰到的问题

3 篇文章 0 订阅
3 篇文章 0 订阅

一.单表数据量大当起始页很后面的时候查询会变的很慢这时候应该怎么处理。

方案一:

         select * from (SELECT ID FROM where 条件 ....)先用查询将id查询出来。原理是因 select * 的时候会将前面每行数据进行扫描,查询出来只有id的情况即只扫描条件字段,当字段多查询条件少的时候在45万数据查询最后200条的情况下会节省3倍时间。

方案二:

        场景单一, 顺序查询,固定分页的情况下,根据 ID, 时间 排序 查询每次将当前页的最后数据 作为下次查询的 条件 如: 表 tb, 里面数据有 id 1~10000 每次查询200条

        第一次查询 : SELECT * FROM tb WHERE id >0 LIMIT 200

        第二次查询 : SELECT * FROM tb WHERE id >200 LIMIT 200

        第三次次查询 : SELECT * FROM tb WHERE id >400 LIMIT 200

二. MyBatis xml 条件标签里参数字符串字段判断数字值的时候 如: <if test ="typeStr  !=null and typeStr == '1'"> 条件不生效

  方案  : 改为: <if test =' typeStr  !=null and typeStr == "1" '> 原理:  " 双引号的条件里面值为数字字符串时会先转换成数字 然后再做比较

三. 在插入数据的时候业务判断数据是否存在如果存在就更新怎么原子操作

INSERT IGNORE INTO names(name,age) VALUES('王五',22)
        ON DUPLICATE KEY UPDATE //根据插入的时候已经触发唯一索引去执行下列的update
            name = VALUES(name),
            age = 35
 
VALUES() 是针对同时插入多条记录时获取正确的待设置值 应该在插入单行的时候使用VALUES,在插入多行的时候使用VALUE

四.如何让 逻辑删除 和 唯一索引 的一起使用

        1表USER , 字段 ID, NAME, PHONE, IS_DELETED

方案一:

        这时需要 唯一索引设置 PHONE,IS_DELETED 

        当一行数据被删除的时候将 IS_DELETED 值设置为 NULL,默认插入时设置为 0 

        这时即可插入同样 PHONE 的数据 (同数据需要逻辑回复业务关联老数据时场景不可使用)

五. 唯一复合索引 顺序搞乱会导致索引失效

       场景说明: 1表USER , 字段 ID, AA, BB, CC,IS_DELETED

方案一:

        这时业务需要 唯一索引设置  BB, CC, IS_DELETED

       在 WHERE 条件里面  IS_DELETED = 0  AND CC = 2 发现索引不生效

原理:实际上在数据库里面会有 BB BB, CC BB, CC,IS_DELETED 三个索引被创建

场景为以下三种:

                1.  CC = ? AND BB =?  会用到第一个索引,

                2. CC=? AND BB = ? MySql会自动排序 满足第二个索引,

                3. CC=? AND IS_DELETED = ? 没有满足的索引他的执行type  = ALL

新版的Mysql 已经解决了这个问题:

        1.顺序不会影响索引的使用,

        2.缺少后面,的字段不会影响索引的使用,缺少前面的字段会有影响

       3.如果不用AND 使用例如 order by 或者 Or 等是不会触发索引的,另外,order by 单个BB是可以触发索引的。

六. 当应用内实体表对象过多,tddl 分库分表数据库连接工具启动过慢优化思路

        我们的一个老项目里面有98张表, 每次启动服务器需要10来分钟,看不下去的我决定优化一下,通过日志发现 tddl 的初始化占用了将近2分多钟

        于是我仔细排查启动日志 发现 tddl 初始化的步骤如下:

                第一步 从domaind 获取配置,初始化 SqlSessionTemplate

                第二步 拉取每张表的分表表名及路由规则                         “tb_XX_0000,tb_XX_0001,tb_XX_0002,tb_XX_0003”

                第三步 拉取每张表的 在配置的 group0 ~ group8 (项目自己配置的) 最多8此去select 定位当前的全局唯一SequenceID (耗时最厉害的步骤)

                 第四步 在插入时,通过 innerStep 配置的数量 获取一批量id VALUE 设置过少 会导致id 获取冲突

               从上面流程不难看出其实可以通过懒加载去实现初始化的过程提高启动速度,比如:

但是发现在beans和 bean 上面加入配置 lazy-init = true 也不会生效。最终仔细排查发现在DAO里面通过@Autowired 去加载了该bean 从而让懒加载配置无效,最终只得写一个SequenceUtils 去springContext 里面去获取对应的Sequence 对象实现懒加载。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我是一名具有一定经验的后端Java开发实习生,我对编写高效可靠的Java代码有着浓厚的兴趣。作为一名技术实习生,我掌握了Java编程语言,并具备解决问题和团队合作的能力。 在我的实习经历,我学习并积累了很多关于后端Java开发的知识。我熟悉Spring框架和Hibernate框架,并且了解如何使用Maven进行项目构建。我还学习过设计模式,并能将其应用到我的代码以提高代码的可维护性和可扩展性。此外,我还了解到了如何优化数据库查询和使用缓存来提高系统性能。 我的实习经验也使我了解到了如何与团队成员进行有效的沟通和协作。我在团队项目承担了一定的责任,并能按时完成分配给我的任务。我乐于分享自己的观点和经验,并尊重他人的意见。在团队,我善于与他人合作,并根据需求做出相应的调整,以达到团队的共同目标。 我是一个积极主动的人,并且渴望学习新的技术和知识。我具备良好的学习能力和解决问题的能力,能够迅速适应新的环境和任务。我相信,在实习,我能够进一步提升自己的技术水平和专业能力,并为团队的发展做出积极的贡献。 感谢考虑我的申请,期待有机会在贵公司展示我的能力和潜力。谢谢! ### 回答2: 实习周志是后端Java开发方向的实习生。作为一名后端开发实习生,周志需要具备一定的Java语言基础和后端开发相关知识。他需要了解如何使用Java语言编写后端代码,以及掌握常用的后端开发框架和工具。 作为一个实习生,周志需要积极主动地学习和实践,提升自己的技术能力。在实习期间,他可以参与实际项目的开发工作,与团队成员一起合作解决问题,学习如何编写高质量的代码。他还可以通过阅读相关技术书籍和参加培训课程等方式来不断学习和成长。 除了技术能力,作为一名后端开发实习生,周志还需要具备良好的沟通能力和团队合作精神。他需要与其他开发人员、产品经理等进行有效的沟通,理解并满足他们的需求。在项目开发过程,他还需要与团队成员密切合作,共同解决各种问题,保证项目的顺利进行。 在实习期间,周志还可以利用自己的实习经验和项目经历来不断完善简历和个人技能。他可以将自己在项目承担的具体任务和所取得的成就详细说明,以展示自己的能力和潜力。在实习结束后,他可以根据对后端开发的深入了解和实践,选择继续深入研究该领域并提升自己的能力,或者选择其他技术方向进行学习和发展。 ### 回答3: 周志是一位后端Java开发实习生。作为一名实习生,他在公司里负责参与Java后端开发相关的工作。在实习期间,周志需要与团队成员合作,根据需求完成软件开发任务。 作为后端开发实习生,周志需要掌握Java编程语言和后端开发相关的技术。他需要熟悉Java的基本语法、面向对象编程思想以及常用的开发框架和工具。另外,周志还需要了解数据库的基本操作和常用的数据库管理系统,以便能够与数据库进行交互。 在实习期间,周志将有机会参与到实际的软件开发项目。他将通过与团队成员的合作,了解项目的需求,并根据需求进行代码编写和功能的实现。周志将积极参与需求讨论会议,并提出自己的想法和建议。 除了参与实际项目开发,周志还将有机会进行相关技术的学习和提升。公司可能会为他提供相关的培训课程或者让他参与到技术分享会议。对于周志来说,这是一个提升自己技术能力的机会,他会积极主动地学习和实践。 在实习期间,周志需要具备一定的学习能力和问题解决能力。他可能会遇到一些难题或者Bug,但是他会积极主动地寻求解决的办法,并与团队成员进行交流和讨论。通过与他人的交流和学习,周志将不断提升自己的技术水平和解决问题的能力。 总体而言,周志是一位有潜力的后端Java开发实习生。他将通过实践和学习,不断提升自己的技术能力和解决问题的能力,成长为一名优秀的后端开发工程师。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值