Java学习总结

来源:互联网 发布:淘宝dsr公式 编辑:程序博客网 时间:2024/06/05 17:08

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 psycopg2import dicomimport osimport tqdmimport redef 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语句。此外,注意操作完毕之后执行关闭连接操作。实际代码强调交互性,需要大量的异常处理模块。