day13_Mysql事务与数据库连接池学习笔记
一、Mysql事务
事务:
1、Mysql中的事务
a、mysql引擎是支持事务的。
b、mysql语句默认是自动提交事务。每条语句都处在单独的事务中。
c、手动控制事务(命令行):
- 开启事务:start transaction; 或者 begin;
- 提交事务:commit;
- 回滚事务:rollback;
2、JDBC如何控制事务?

3、事务的特性(ACID)(面试题)
- 原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。多条语句变成一个不可分割的整体。
- 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
- 隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。(多线程)
- 持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
4、事务的隔离级别
赃读:指一个事务读取了另一个事务未提交的数据。 读到的是假的数据。
不可重复读:在一个事务内读取表中的某一行数据,多次读取的结果不同。一个事务读取到了另一个事务提交后的数据。(update) 每次读到的结果不一样。
虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取的结果不一致。(insert) 读到的数据变多了。
数据库通过设置事务的隔离级别防止以上情况的发生:
- 、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。 read uncommitted
- 、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的) read committed
- 、REPEATABLE READ: 避免赃读、不可重复读。虚读有可能发生。(mysql默认的) repeatable read
- 、SERIALIZABLE: 避免赃读、不可重复读、虚读。 serializable
mysql中:
查看当前的事务隔离级别:SELECT @@TX_ISOLATION;
更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。

5、JDBC控制事务的隔离级别
Connection接口:

JDBC代码中设置隔离级别:必须在开启事务之前。

@font-face { font-family: "Times New Roman" }
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New Roman"; font-size: 10.5000pt }
h1 { margin-top: 17.0000pt; margin-bottom: 16.5000pt; page-break-after: avoid; text-align: justify; line-height: 240%; font-family: "Times New Roman"; font-weight: bold; font-size: 22.0000pt }
h2 { margin-top: 13.0000pt; margin-bottom: 13.0000pt; page-break-after: avoid; text-align: justify; line-height: 172%; font-family: Arial; font-weight: bold; font-size: 16.0000pt }
h3 { margin-top: 13.0000pt; margin-bottom: 13.0000pt; page-break-after: avoid; text-align: justify; line-height: 172%; font-family: "Times New Roman"; font-weight: bold; font-size: 16.0000pt }
span.10 { font-family: "Times New Roman" }
span.15 { font-family: "Courier New"; font-size: 10.0000pt }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
table.MsoNormalTable { font-family: "Times New Roman"; font-size: 10.0000pt }
table.MsoTableGrid { text-align: justify; font-family: "Times New Roman"; font-size: 10.0000pt }
div.Section0 { }
--> { }
一、数据库连接池
1、连接池原理:(面试)
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
通过释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
这项技术能明显提高对数据库操作的性能。


目的:解决建立数据库连接耗费资源和时间很多的问题,提高性能。
2、编写标准的数据源
自定义的数据库连接池要实现javax.sql.DataSource接口,一般都叫数据源。
实现DataSource接口,并实现连接池功能的步骤:
1. 在MyDataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。
2. 实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。
3. 当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。
Collection保证将自己返回到LinkedList中是此处编程的难点。

3、编写数据源时遇到的问题及解决办法

a、装饰设计模式:使用频率很高
目的:改写已存在的类的某个方法或某些方法,装饰设计模式(包装设计模式)
口诀:
1、编写一个类,实现与被包装类相同的接口。(具备相同的行为)
2、定义一个被包装类类型的变量。
3、定义构造方法,把被包装类的对象注入,给被包装类变量赋值。
4、对于不需要改写的方法,调用原有的方法。
5、对于需要改写的方法,写自己的代码。
// 该类本身就是一个装饰类,对原类的具体装饰饰在该类中实现。(但是需要写很多多余的代码)

b、默认适配器模式:是装饰设计模式的一个变体


4、常用的数据源配置(日后都使用数据源,所以一定要配置一下)
4.1、DBCP(数据源开源框架)
DBCP:Apache推出的 DataBase Connection Pool 数据连接池(数据源)
使用步骤:
> 添加jar包:commons-dbcp-1.4.jar 和 commons-pool-1.5.6.jar 和 mysql-connector-java-5.0.8-bin.jar
> 添加属性资源文件(等待时间,最大连接数等配置信息)

数据源操作的工具类:
测试类:

4.2、C3P0
使用步骤:
1、添加jar包
这次我们使用的是Java Project项目,在该项目下新建lib文件夹,添加jar包:c3p0-0.9.1.2.jar,再添加至构建路径。
2、编写配置文件
c3p0-config.xml,放在classpath中,或classes目录中
3、编写操作数据源的工具类
4、编写测试类
注意:测试类类名TsetCRUD、TestDao、TestJDBC,名字含义都一样。
5、用JavaWeb服务器管理数据源(连接池):比如用Tomcat,此时不需要导入jar包
开发JavaWeb应用,必须使用一个JavaWeb服务器,JavaWeb服务器都内置数据源。
Tomcat:(DBCP)
数据源只需要配置服务器即可。
配置数据源的步骤:
1、拷贝数据库连接的jar包mysql-connector-java-5.0.8-bin.jar到tomcat的lib目录下。
2、配置数据源XML文件:
a)如果把配置信息写在tomcat下的conf目录的context.xml中,可以配置多个不同的数据源,那么所有应用都能使用此数据源。

3、如何使用连接池呢?如下:
在xxx.jsp下加入:<% ...... %>
JNDI:java nameing directory interface
有多个<Resource/>,就有多个name,多个name就变成了JNDI。
JNDI容器就是一个Map。
二、自定义JDBC框架(练技术)
1、数据库元信息的获取(很简单、很无聊、很重要)
a、元信息:(Meta Data)指数据库或表等的定义信息。
2、自定义JDBC框架
反射:
策略设计模式:
day13_Mysql事务与数据库连接池学习笔记的更多相关文章
- JAVA jdbc(数据库连接池)学习笔记(二) SQL注入
PS:今天偶然间发现了SQL的注入...所以就简单的脑补了一下,都是一些简单的例子...这篇写的不怎么样...由于自己没有进行很深的研究... 学习内容: 1.SQL注入的概念... 所谓SQL注 ...
- JAVA jdbc(数据库连接池)学习笔记(一)
学习内容: 1.JDBC的含义... JDBC想必学过JAVA的就不会陌生,JDBC到底是什么呢?其实就是由JAVA的一些类和接口构成的API,保存在java.sql和javax.sql..包中的一些 ...
- JAVA jdbc(数据库连接池)学习笔记(转)
学习内容: 1.JDBC的含义... JDBC想必学过JAVA的就不会陌生,JDBC到底是什么呢?其实就是由JAVA的一些类和接口构成的API,保存在java.sql和javax.sql..包中的一些 ...
- 第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles 前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许 ...
- 14mysql事务、数据库连接池、Tomcat
14mysql事务.数据库连接池.Tomcat-2018/07/26 1.mysql事务 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功. MySQL手动控制事务 开启事 ...
- Linux简易APR内存池学习笔记(带源码和实例)
先给个内存池的实现代码,里面带有个应用小例子和画的流程图,方便了解运行原理,代码 GCC 编译可用.可以自己上网下APR源码,参考代码下载链接: http://pan.baidu.com/s/1hq6 ...
- c++11 线程池学习笔记 (一) 任务队列
学习内容来自一下地址 http://www.cnblogs.com/qicosmos/p/4772486.html github https://github.com/qicosmos/cosmos ...
- android中的线程池学习笔记
阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...
- c++11 线程池学习笔记 (二) 线程池
学习内容来自以下地址 http://www.cnblogs.com/qicosmos/p/4772486.html github https://github.com/qicosmos/cosmos ...
随机推荐
- Linux学习笔记 --iptables防火墙配置
iptables防火墙配置 一.防火墙简介 1.功能: 1)通过源端口,源IP地址,源MAC地址,包中特定标记和目标端口,IP,MAC来确定数据包是否可以通过防火墙 2)分割内网和外网[附带的路由器的 ...
- android 打造不同的Seekbar
最近项目需要用到双向的seekbar,网上找了好多野不能达到要求,偶然一次机会看到了大众点评的例子,然后我最他做了优化,并对常用的seekbar做了总结. 向上两张图: 比如双向seekbar pub ...
- ITU-T Technical Paper: QoS的构建模块与机制
本文翻译自ITU-T的Technical Paper:<How to increase QoS/QoE of IP-based platform(s) to regionally agreed ...
- ubuntu下eclipse新建项目没有java project的解决办法
装好了eclipse之后却发现新建项目没有java project的选项,大致搜索了一下,并没有发现很好的解决方案(大都是让你重新安装什么的),于是开始瞎鼓捣,并且找到了一个方案: 在终端切换到roo ...
- Android群英传笔记——第二章:Android开发工具新接触
Android群英传笔记--第二章:Android开发工具新接触 其实这一章并没什么可讲的,前面的安装Android studio的我们可以直接跳过,如果有兴趣的,可以去看看Google主推-Andr ...
- Android群英传笔记——第一章:Android体系与系统架构
Android群英传笔记--第一章:Android体系与系统架构 图片都是摘抄自网络 今天确实挺忙的,不过把第一章的笔记做一下还是可以的,嘿嘿 1.1 Google的生态圈 还是得从Android的起 ...
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...
- Aandroid 图片加载库Glide 实战(一),初始,加载进阶到实践
原文: http://blog.csdn.net/sk719887916/article/details/39989293 skay 初识Glide 为何使用 Glide? 有经验的 Android ...
- leetCode之旅(12)-反转二叉树
背景描述 Homebrew 是 OS X 平台上的包管理工具.用其官网的话说就是: the missing package manager for OS X | OS X 平台遗失的包管理器. 相信在 ...
- https认证
HTTPS认证 说明 1. HTTPS协议的站点信息更加安全,同时可降低网站被劫持的风险,如网站同时存在HTTP和HTTPS站点,可使用本工具进行认证,便于百度搜索识别网站HTTP与HTTPS之间的对 ...