Java学习总结

6 篇文章 0 订阅
1 篇文章 0 订阅

Java学习总结(三)

关于JDBC与数据库知识

在数据库进行海量数据处理过程中,通常由以下方法:

分区处理

在一些数据库的官方文档中,可以讲数据库分为以下常用三个分区:
一、范围分区
最常见的例子就是根据时间字段进行范围划分。
二、哈希分区
利用hash函数运算,从而使数据均匀分布在各个分区并方便于并行处理。适用于各个分区中数据要求均匀的情况下使用。但要求数据应当重复率较低。
三、列表分区
适用于有高重复率的字段值表。进行列值于分区的映射。

索引

一、B树索引
在数据量不大时。B树累哦非常好地完成工作,几乎成了索引的代名词。键值重复率低的字段比较适合B树索引。
这里重点介绍B树,B树是由二叉搜索树扩展而来。二叉搜索树是由L,k,R三部分构成。其中L,R又分别代表一颗二叉搜索树,满足以下条件:
key(L)<=k<=key(R)
将这一定义进行推广,如果树中包含多个键值以及分支,那么它就是一颗B树。排列方式如下:
c1,k1,c2,k2.c3,k3,c4,k4
B树节点满足以下限制:
一、所有的键值按照单调递增的顺序进行保存,即 k1<=k2<=k3<=k4 ;
二、对于任意 ki ,子树 ci 中的所有元素都不大于 ki ,且 ki 不大于子树 ci+1 中任意元素。
三、所有的叶子结点具有相同的深度。
四、为了保证平衡性,定义整数t,称为B树的最小度数
——每个节点最多含有 2t1 个键值。
——除根节点以外,每个节点至少含有 t1 个键值。
t值往往展现的是中心节点,这对于树的拆分很有帮助。

class BTree:
    def __init__(self, t=TREE_2_3_4):
        self.t = t
        self.keys = [] #self.data = ...
        self.children = []
    def is_leaf(t):
        return t.children == []
    def is_full(node):
        return len(node.keys) >= 2 * node.t - 1
##have not debug yet,please correct me if it has any problems##
def B_tree_search(tr, key):
    for i in range(len(tr.keys)):
        if key==tr.keys[i]:
            return(tr,i)
        elif key<tr.keys[i]:
            tr=tr.children[i]
            if tr.is_lead:
                return "没有找到"
            else:
                B_tree_search(tr, key)
        elif key>tr.keys[-1]:
            i=i+1
            tr=tr.children[i]
            if tr.is_lead:
                return "没有找到"
            else:
                B_tree_search(tr, key)

二、位图索引
实际情况下,存放海量数据的表中几乎很少使用主键,因为这些表都是一存放事实数据为目的,而不是作为参照表被引用。位图索引适用于重复字段多的数据。
定义:位图索引的键值是重复率较高的字段,存储的是每行该关键字的标志位,有则置1,无则置0。
二、适用于特定的SQL操作。位图索引非常适合在索引字段见进行诸如计数(count)、或(or)、与(and)这样的操作。
三、系统适应性问题。位图的引入,主要是解决海量数据下查询性能的问题,适用范围为OLAP和数据仓库型数据库。而不是OLTP。

三、全文索引
全文索引属于语言文学的范畴,它的属性和语言文字的属性直接相关联起来。

架构

RAC、负载均衡、冗余备份。

关于数据库的一些相关概念

主键或者唯一性约束:主键更强调表的关系性,他可以被其他表的外键所引用;而唯一性约束则强调字段值的唯一性。

关于delete/truncate、drop的相关操作:
1、delete消耗大量的系统资源且无法释放空间。属于DML事件机制中,可以回滚复原。
2、truncate属于一种DDL,一旦操作,便立即释放空间。一旦执行便不能回滚,且操作速度比delete块。

OLTP与OLAP的介绍
数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
OLTP 系统强调数据库内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作;
OLTP比较常用的设计与优化方式为Cache技术与B-tree索引技术。瓶颈在于CPU与磁盘子系统。
OLAP 系统则强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等
数据库对比

实际编程中数据库实用知识

上述介绍了许多关于数据库的概念,但是在实际编程中,其实用到最广泛的是两类知识:

一、游标
二、事物处理(ADIC):取消数据库自动提交过程,执行多条SQL语句,如果没有异常则提交,如果发生异常则回滚。(重点强调原子性和一致性)

以下为了方便分析,贴上最近导师要我写的一段 python 代码对数据库进行操作:

import psycopg2
import dicom
import os
import tqdm
import re

def insert_db(pathname):
    info=loadFileInformation(pathname)
    try:
        conn=psycopg2.connect(host="192.168.4.128",user="postgres",password="lmi456",dbname="axesdb")
    except:
        print('数据库连接信息有误,请核对后进行修改')
    ##该部分进行实例化,并显示连接到数据库的信息##
    cur=conn.cursor()
    print('请核实数据库信息,数据库名字为:%s\n数据库的IP地址为:%s\n端口号为:%s\n用户名是:%s\n'%(conn.get_dsn_parameters()['dbname']\
,conn.get_dsn_parameters()['host'],conn.get_dsn_parameters()['port'],conn.get_dsn_parameters()['user']))
    ###初始化查询信息####
    pat_id=info["PatientID"]
    s_iuid=info['SOPInstanceUID']
    i_iuid=info['SeriesInstanceUID']
    try:
        cur.execute("ROLLBACK;")
        SQL1="INSERT INTO public.ta_nodule (nodule_name) VALUES (%s);"
        data1=(pat_id,)
        cur.execute(SQL1, data1)
    #         conn.commit()
        ##传输完成后依据pat_id找到主键nodule_no###
        SQL2="select nodule_no from public.ta_nodule where nodule_name=(%s);"
        cur.execute(SQL2, data1)
        nodule_no=cur.fetchone()[0]
        print(nodule_no)##
        ##接下来将以上信息插入两张关联表###
        ###################################
        ##1、依照SOPInstanceUID查询图片主键##
        SQL3="select id from public.t_image where sop_iuid=(%s);"
        data3=(s_iuid,)
        cur.execute(SQL3, data3)
        fk_image_no=cur.fetchone()[0]
        print(fk_image_no)
        ##插入操作##
        SQL4="INSERT INTO public.ta_image_nodule (fk_nodule_no,fk_image_no) VALUES (%s,%s);"
        data4=(nodule_no,fk_image_no,)
        cur.execute(SQL4, data4)

        ##2、依照SeriesInstanceUID查询图片主键##
        SQL5="select id from publicwhere .t_series series_iuid=(%s);"
        data5=(i_iuid,)
        cur.execute(SQL5,data5)
        fk_series_no=cur.fetchall()[0][0]
        print(fk_series_no)
        ##插入操作##
        SQL6="INSERT INTO public.ta_series_nodule (fk_series_no,fk_nodule_no) VALUES (%s,%s);"
        data6=(fk_series_no,nodule_no,)
        cur.execute(SQL6, data6) 
        conn.commit()
    except:
        ....

数据库为postgresql,前面导入了部分库是处理医疗影像dicom数据的。从图像中提取信息插入到数据库中。上述代码片很重要的两段即连接数据库部分,当数据库成功简历连接以后,随后就是靠游标来提交数据库的操作命令了。游标最重要的两个方法分别是execute*()和fetch*()方法,所有针对数据库的请求操作都是依靠他们完成。
事件处理用到的是数据库中commit()方法如果不成功可调用rollback()方法,也可以提交rollback语句。此外,注意操作完毕之后执行关闭连接操作。实际代码强调交互性,需要大量的异常处理模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值