• 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的属性。那里就是表示数据库的默认最大连接量。

  • 相关阅读:
    [Tkinter 教程12] 布局管理 (Pack Place Grid)
    python 文本全选
    CMD窗口恢复默认设置
    Python基础第一天
    Windows:安装Python2.7、3.6与共存,安装pycharm
    Linux安装
    Python input() 函数
    python的continue和pass的区别
    Python 文件读写操作实例详解
    python tkinter教程-事件绑定
  • 原文地址:https://www.cnblogs.com/fengshaolingyun/p/6785075.html
Copyright © 2020-2023  润新知