数据库-JDBC技术

news/2025/2/12 0:13:11/

数据库性能最佳实践

JDBC

性能对于数据库应用程序框架的影响

JDBC驱动

是影响数据库应用程序的最重要的因素,替代方案是因为具有更好的性能

  1. 工作在哪里执行
  • 瘦驱动
    应用程序的内存占用更小,依赖数据库服务器完成更多的处理工作
  • 胖驱动
    将工作从数据库服务器转移至应用程序,客户端需要处理更多的任务

驱动工作环境反应了驱动的性能

JDBC链接池

服务器维护JDBC的连接池,池化对象占用的内存和池化将触发额外GC数量之间取得平衡。

实际链接的对象可能不是很大,但是语句缓存(基于每个链接而存在)可能很大。

如果数据库是瓶颈,向忙碌的系统施加负载只会降低性能

改善方法:

用连接池的限制发送最小规模的数据库的工作量。

应用程序线程可能需要等待一个空闲链接,但如果数据库没有压到,系统总吞吐量会最大化。

预处理语句和语句池

PreparedStatement预处理调用允许数据库重用正在执行SQL信息

为后续数据库执行语句节省了工作

预处理语句还具有安全性和编程的优势,特别是调用指定参数方面

PrepareStatement预编译重用:

第一次执行SQL语句,将SQL发送给数据库服务器进行解析,编译和优化,然后将结果缓存起来便于后面执行。

  1. 建立语句池
    预处理语句池的运转以每个链接为基础。
    如果程序中的一个线程从池中取出一个链接并在该链接上使用预处理语句,那么这个语句关联只对该链接有效。
    每个链接实例都会关联自己的语句池,最后语句池中会包含所有的语句池。
    当第一个链接没有用到特定预处理语句时,第一个请求会慢一点。
    连接池关联的语句池会占用堆内存,大量的堆空间,看看是否对GC时间产生负面影响。
  2. 管理语句池
    设置语句池是否开启和是否处理。
事务处理

应用程序对正确性要求最终决定了事务的处理方式。

数据库事务有两方面的性能损失:

  • 事务的创建和提交需要时间——不确定的时间
  • 数据库处理事务的过程中会获得一组特定数据的锁,如果两个事务竞争一个数据锁,应用程序的可扩展将收到影响。

如何对事务编程和如何在事务中持有数据库锁的问题思考

  1. JDBC事务控制
    事务的开始和结束都基于Connection对象的使用方式
    用法:链接一个自动提交模式(setAutoCommit)不需要自动提交,如果自动提交会有性能影响,如果关闭自动提交,链接一个对象上的第一次调用会默认创建一个隐式的事务,这个事务持续到显示执行提交或者回滚方法。使用该链接的下一个数据库调用会开启一个新的事务。
    基于事务提交成本高的原因平衡一下事务执行的工作和事务锁的设计之间的平衡。
    批处理对于数据库调用和事务的平衡。

  2. 事务隔离和锁
    数据库的可扩展性——因为数据在事务中被锁定,锁可以保证数据的完整性-让事务处理隔离态。
    1.TRANSACTION_SERIALIZABLE 可串行化
    在事务执行期间,事务访问的所有数据都被锁定,序列化事务每次查询是看到的数据都是一样。防止脏读,幻读,不可重复读

    2.TRANSACTION_REPEATABLE_READ 幻读
    事务运行期间,被访问数据都锁定,其他事务可在任何时候写入数据到表,
    导致幻读的原因是执行查询语句之后另一个事务写入数据后再次查询发现数据变了。

    1. TRANSACTION_READ_COMMITTED 不可重复读
      只锁定事务进行期间被写入的数据,当前事务作用域,导致不可重复读原因是事务运行期间某一个时刻读取数据和另一个时间不同,因为当前事务提交了数据。
      允许多个事务读取提交的数据,如果有修改的事务执行则必须等待该事务的提交。

    4.TRANSACTION_READ_UNCOMMITTED 脏读
    无锁,一个事务可以读取在另一事务中未提交的数据,可造成脏读是因为其他事务可能并没有实际发生写操作而导致获取错误的数据。

结果集处理

setFetchSize方法设置驱动一次加载数据行数——平衡JDBC内部缓冲区和应用程序的使用


http://www.ppmy.cn/news/32799.html

相关文章

系统集成项目管理工程师:第18章项目风险管理学习笔记

第18章项目风险管理 一、目录 18.1 风险概述 18.1.1 风险的定义 18.1.2 风险的分类 18.1.3 风险的性质 18.2 项目风险管理 18.3 规划风险管理 18.3.1 规划风险管理的输入 18.3.2 规划风险管理的工具与技术 18.3.3 规划风险管理的输出 18.4 识别风险

Netty——心跳机制与断线重连

心跳机制与断线重连心跳机制IdleStateHandler客户端服务端测试正常情况异常情况总结断线重连为了保证系统的稳定性,心跳机制和断线重连可是必不可少的,而这两个在Netty中也是非常好实现的心跳机制 我们以客户端发送心跳为例,平时我们的心跳实…

vFlash软件简介

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

mysql-online-ddl是否需要rebuild

一、背景 DDL一直是DBA业务中的大项,看了TIDB的DDL讲解,恰巧我们的mysql业务大表也遇到了DDL的变更项,变更内容是将varchar(10)变更成varchar(20),这个变更通过官方文档很容易知道是不需要rebuild的(这里要注意下这个varchar(255…

【操作系统复习】ch3 内存基础

内存基础 内存存储数据与指令,如果想让数据交给cpu进行处理,需要将数据放入内存。内存一般按字/字节进行编址指令一般包含操作码以及若干参数,有些参数是存储在内存当中的,表明的就是内存的地址逻辑地址:在程序编译链…

Qt学习_08_用独立的文件存放样式表

0 前言 上一篇笔记对样式表进行了初步学习,QT学习_07_样式表的初步学习_江湖上都叫我秋博的博客-CSDN博客,在文末我们提到了“样式表肯定不能直接这么写在构造函数里面,那么多样式表看着心就堵,所以下一篇文章考虑如何把样式表用…

转解疑难杂症,详解vector迭代器失效和深浅拷贝的问题

前文http://t.csdn.cn/kVeVX——vector模拟实现本篇文章主要是针对vector中的两个比较经典的问题同时也是上一篇文章遗留下来的问题进行详细解释,第一个就是迭代器失效的问题,第二个是深浅拷贝的问题。ps:注意本文演示用的代码是上一篇vector…

基于springboot+vue的“智慧食堂”程序【毕业论文,源码】

系统登录界面系统架构开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat开发软件:eclipse/myeclipse/ideaMaven包:Maven浏览器&#xf…