JDBC编程扩展
数据库的分类:
关系型数据库、非关系型数据库。这跟数据库的发展相关。
关系型数据库:mysql、oracle、sqlserver
非关系型数据库:redis、memcathe、mogodb、hadoop
1、JDBC
api层:程序员针对api层开发程序,告诉程序要链接到哪里,使用什么驱动
接口层:java针对各大数据库厂商开发的接口,由数据库厂商去完成实现。
一般在开始之前,就Connection con=null;Statement state=null;ResultSet rs=null;后期先判断非空,然后再关闭。不判断有可能空指针异常。
2、游标
应用场景:一次读取多行数据库记录
过滤条件太弱,读取记录过多
问题分析:一次读取大量数据库记录,会造成内存溢出(JVM内存大小限制)
游标:客户端读取部分服务器结果集的机制
使用方式:URL添加参数useCurorFetch=true(获取链接的时候)
使用preparedStatement
setFetchSize()设置游标的大小
示例:preparedStatement ps = null;
String sql="select * from t_user where sex = ?";
ps = con.prepareStatement(sql);
ps.setFetchSize(10);
ps.setString(1,"男");
rs = ps.executeQuery();
3、流方式
应用场景:读取大字段的内容
问题分析:读取的一行记录太大,造成内存溢出
流方式:将大字段内容以二进制流的方式,划分为多个区间,每次出来一个区间。
使用方法:ResultSet.getBinaryStream()
示例:class.forName("");
con = DriverManage.getConnection(DB_url,user,pwd)
String sql = "select * from user";
PreparedStatement ps=null;
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
InputStream in = rs.getBinaryStream();
File f = new File("文件路径");
OutputStream out = null;
out = new FileOutputStream(f);
byte[] b=new byte[1024];
int temp=0;
while((temp=in.read(b))!=-1){
out.write(b,0,temp);
}
}
4、批量插入
应用场景:离线数据挖掘分析导入数据库,展示数据
数据迁移
定时刷新缓存数据到数据库
分析:SQL解析花销
网络传输花销
日志刷新的花销
法一:批处理:addBatch()将多个insert语句,添加到同一个
executeBatch()
clearBatch()
法二:批量插入: insert into table value ()()()
事务
事务的特性(ACID):原子性:atomicity 事务的原子性确保要么全部完成,要么完全不起作用
一致性:consistency 一旦所有事务动作完成,事务就被提交。也就是说要么都成功,要么都不成功。
隔离性:isolation 多个事务同时处理一个数据的时候,每个事务都应该与其它事务隔离开来,防止数据损坏。
持久性:durability 一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。应该被持久化到数据库中。
同一个Connection,setAutoCommit(false)//设置自动提交为false,commit()//完成部署以后提交,rollback()//在catch块中执行。使用PreparedStatement预处理。
脏读:读取一个事务未提交的更新
不可重复读:同一个事务中两次读取相同的记录,结果不一样
幻读:两次读取的结果包含的行记录不一样
事务的隔离级别:
读未提交(read uncommitted) 允许出现脏读、不可重复读、幻读
读提交(read committed) 不允许出现脏读、可能出现重复读、幻读
重复读(repeatable read) 不能出现重复读、可能出现幻读
串行化(serializable) 都不准发生
MySql默认级别是:repeatable read 重复读
事务隔离级别越高,数据库性能越差。
数据库连接池
作用:1、实现限流的作用,保护数据库
2、实现连接的复用
数据库在启动的时候,会初始化一些链接到连接池中,客户端在请求连接的时候,会首先到连接池里请求租借一个连接,用完再还回到连接池中,供其它请求使用。值得注意的是:服务器会自动关闭8个小时以上的空闲链接,所以我们应该定期维护数据库连接池。
常见的数据库服务器架构:
1、读写分离:非一致性读分散到多个只读节点上(从库)
一致性读和事务依然由主节点承担(主库)
2、缓存+数据库:业务服务器————缓存————数据库。业务服务器进行的数据交互动作会先放到缓存中,数据库只需要定期的从缓存中异步刷新到数据库即可。
3、分布式数据库:
数据库设计的三大范式:
1、数据库表中的每一列是不能进行分割的基本数据项,同一个列中不能有多个值,也就是实体类的属性不能有重复的多个值。
2、表中每一行必须可以被唯一区分。为实现区分,通常加上一列,以存储各个实例的唯一标识。也就是主键
3、要求一个数据库表中不包含已在其它表中已包含的非主关键信息。也就是外键。
当然有时候我们设计表的时候,也不完全遵循这些范式,这就是反三范式:有的时候为了效率查询,通常会设置重复的字段。例如订单和订单项。订单的总价可以由单价和数量计算而来,但是如果订单很多的时候,在获取的时候才去计算,效率就很低。
数据库默认的最大链接数:100.在mysql的配置文件中,有一个my.**的配置文件,里面有个maxinum的属性。那里就是表示数据库的默认最大连接量。
JDBC编程扩展的更多相关文章
- 第十三章.MySQL数据库与JDBC编程(下)
JDBC的典型用法: JDBC4.2常用接口和类简介: DriverManager:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取Connection对象,该类包含如下方法: publi ...
- MySQL之JDBC编程增删改查
MySQL之JDBC 一.JDBC是什么 Java DatabaseConnectivity (java语言连接数据库) 二.JDBC的本质 JDBC是SUN公司制定的一套接口(interface). ...
- 单独使用jdbc编程问题总结(一)
在学习Mybatis之前,我们先来回顾JDBC编程的相关知识.在此基础上深入的学习Mybatis框架.如有错误,敬请指正. (一)首先我们既然要使用jdbc,当然是要操作数据库了.创建一个名为:myb ...
- 浅谈JDBC编程
一.概述 1.为什么要用JDBC 数据库是程序不可或缺的一部分,每一个网站和服务器的建设都需要数据库.对于大多数应用程序员(此处不包含数据库开发人员)来说,我们更多的不是在DBMS中对数据库进行操纵, ...
- 02Mybatis_原生态jdbc编程中的问题总结——从而引生出为什么要用Mybatis
我们先用jdbc去编写一个例子: 第一步:建表 /* SQLyog v10.2 MySQL - 5.1.72-community : Database - mybatis ************** ...
- JDBC编程的方式
JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 从上面可以看出JDBC编程一般要如下步骤: 1. 加载数据库驱动 2. 创建并获取数据库连接 3. 创建jdbc stateme ...
- JAVA基础知识之JDBC——编程步骤及执行SQL
JDBC编程步骤 下面以mysql数据库为例, 1.加载驱动 首先需要下载数据库的驱动jar文件,并且在eclipse包中加入到class path中去, 例如mysql的驱动文件 mysql-con ...
- JDBC编程 之 增删改查
JDBC编程之数据增加,更改,查询,删除 package com.good.jdbc; import java.sql.Connection; import java.sql.DriverManage ...
- JDBC编程步骤
JDBC编程步骤 加载数据库驱动. 通常使用Class类的forName()静态方法来加载驱动. Class.forName(driverClass) dirverClass: mysql---Cla ...
随机推荐
- 20162328蔡文琛week08
学号 20162328 <程序设计与数据结构>第X周学习总结 教材学习内容总结 错误和异常代表不常见的或不正确处理的对象. 抛出异常时输出的消息提供了方法调用栈的轨迹. 每个catch子句 ...
- 软工1816 · Beta冲刺(5/7)
团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 推进后端完成安卓端接口的开发 在测试中发现返回地图接口存在错误(待修复) 推进 ...
- SQL Server 2008 存储过程示例
出处:http://www.jb51.net/article/54730.htm --有输入参数的存储过程-- create proc GetComment (@commentid int) as s ...
- 结对项目作业报告——四则运算web项目
成员:顾思宇2016011993 程羚2016012050 1.仓库地址:https://git.coding.net/DandelionClaw/WEB_Calculator.git 注: 本项 ...
- Alpha版本冲刺(六)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- CANOpen的几种操作以及数据
其实3年前在21ic就准备做这篇文章了,那时,CANOpen也只是刚刚在国内推广,所以几乎没有项目用到.现在有了实际的项目,完全确认了以前移植和测试的代码,所以列举一些CANOpen的底层操作以及数据 ...
- 打开ubuntu终端的两个方法【最快速】
两种快捷方法: 1. ctrl+alt+T. 2. 桌面右击,再点击终端.
- Beta阶段DAY5
一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:改进UI,美化界面. 林庭亦:优化代码结构 郑子熙:改进UI,美化界面. 陈文俊:优化代码结构 2.讨论项目每 ...
- 第十周(11.18-11.24)----个人项目----学习java总结2
一.获取随机数 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1)) ,注意这里的每一个括号最好都不要省略掉. 例: public static void main(S ...
- Pytest - 进阶功能fixture
1. 概述 Pytest的fixture功能灵活好用,支持参数设置,便于进行多用例测试,简单便捷,颇有pythonic.如果要深入学习pytest,必学fixture. fixture函数的作用: 完 ...