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树。排列方式如下:
B树节点满足以下限制:
一、所有的键值按照单调递增的顺序进行保存,即
二、对于任意
三、所有的叶子结点具有相同的深度。
四、为了保证平衡性,定义整数t,称为B树的最小度数:
——每个节点最多含有
——除根节点以外,每个节点至少含有
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语句。此外,注意操作完毕之后执行关闭连接操作。实际代码强调交互性,需要大量的异常处理模块。
- java框架学习总结
- java学习一路总结
- java线程学习总结
- JAVA SWING学习总结
- Java学习总结
- java学习总结
- Java Web学习总结
- java学习总结-序
- java多线程学习总结
- java多线程学习总结
- java学习总结篇
- 学习java总结
- java web 学习总结
- Java 语言学习总结
- 学习JAVA问题总结
- java线程学习总结
- java 高新技术学习总结
- java Date学习总结
- bzoj 3930: [CQOI2015]选数
- SQL 常用查询语句
- overflow:hidden作用
- Ubuntu搭建TFTP服务
- spring-data-jpa 中文文档(2)
- Java学习总结
- Impala:新一代开源大数据分析引擎
- [ABP开源项目]--vue+vuex+vue-router+EF的权限管理系统
- C#构建代码出现not all code paths return a value错误
- intellij idea文件颜色代表的含义
- NYOJ 311 完全背包
- 面试问题
- tcp协议知识点
- 欢迎使用CSDN-markdown编辑器