day13_Mysql事物与数据库连接池学习笔记


一、Mysql事务

事务:

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功(数据回滚)

例如:A给B转帐,对应于如下两条sql语句

update account set money=money-100 where name=‘a‘;

update account set money=money+100 where name=‘b‘;

1、Mysql中的事务

a、mysql引擎是支持事务的。

b、mysql语句默认是自动提交事务。每条语句都处在单独的事务中。

c、手动控制事务(命令行):

  • 开启事务:start transaction; 或者 begin;
  • 提交事务:commit;
  • 回滚事务:rollback;

2、JDBC如何控制事务?

3、事务的特性(ACID)(面试题)

    • 原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。多条语句变成一个不可分割的整体。
    • 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
    • 隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。(多线程)
    • 持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

4、事务的隔离级别

赃读:指一个事务读取了另一个事务未提交的数据。 读到的是假的数据。

不可重复读:在一个事务内读取表中的某一行数据,多次读取的结果不同。一个事务读取到了另一个事务提交后的数据。(update) 每次读到的结果不一样。

虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取的结果不一致。(insert) 读到的数据变多了。

数据库通过设置事务的隔离级别防止以上情况的发生:

  • 1、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。 read uncommitted
  • 2、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的) read committed
  • 4、REPEATABLE READ: 避免赃读、不可重复读。虚读有可能发生。(mysql默认的) repeatable read
  • 8、SERIALIZABLE: 避免赃读、不可重复读、虚读。 serializable
级别越高,性能越低,数据越安全。实际开发是以级别2、4为主,其余的用程序控制。

mysql中:

查看当前的事务隔离级别:SELECT @@TX_ISOLATION;

更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。

特别注意:设置隔离级别必须在开启事务之前。



5、JDBC控制事务的隔离级别

Connection接口:

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

注意:mysql的默认级别,若是操作mysql数据库,可以不用设置,默认设置就是这个。


@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、常用的数据源配置(日后都使用数据源,所以一定要配置一下)

3.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

> 添加属性资源文件(等待时间,最大连接数等配置信息)

> 编写数据源操作的工具类

数据源操作的工具类:


测试类:

3.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中,可以配置多个不同的数据源,那么所有应用都能使用此数据源。

b)如果是在当前应用的META-INF中创建context.xml,编写数据源,那么只有当前应用可以使用此数据源。

演示b)

context.xml文件

3、如何使用连接池呢?如下:

在xxx.jsp下加入:<% ...... %>

JNDI:java nameing directory interface 

有多个<Resource/>,就有多个name,多个name就变成了JNDI。

JNDI容器就是一个Map。

二、自定义JDBC框架(练技术)

1、数据库元信息的获取(很简单、很无聊、很重要)

a、元信息:(Meta Data)指数据库或表等的定义信息。

2、自定义JDBC框架

反射:

策略设计模式:


来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/chenmingjun/p/9037025.html

时间: 2024-10-30 07:18:55

day13_Mysql事物与数据库连接池学习笔记的相关文章

JAVA jdbc(数据库连接池)学习笔记(转)

学习内容: 1.JDBC的含义... JDBC想必学过JAVA的就不会陌生,JDBC到底是什么呢?其实就是由JAVA的一些类和接口构成的API,保存在java.sql和javax.sql..包中的一些API... 2.使用JDBC的原因...   那么为什么要使用,这个想必大家也是更为了解了,一个应用程序如果不和数据库进行连接,那这根本就不算是个应用程序,那么应用程序是不能直接对数据库进行操作的,那么就需要一个辅助工具去连接数据库,从而操作数据库...那这个辅助的工具就是JDBC了,这个仅限于J

JAVA jdbc(数据库连接池)学习笔记(一)

学习内容: 1.JDBC的含义... JDBC想必学过JAVA的就不会陌生,JDBC到底是什么呢?其实就是由JAVA的一些类和接口构成的API,保存在java.sql和javax.sql..包中的一些API... 2.使用JDBC的原因...   那么为什么要使用,这个想必大家也是更为了解了,一个应用程序如果不和数据库进行连接,那这根本就不算是个应用程序,那么应用程序是不能直接对数据库进行操作的,那么就需要一个辅助工具去连接数据库,从而操作数据库...那这个辅助的工具就是JDBC了,这个仅限于J

Linux简易APR内存池学习笔记(带源码和实例)

先给个内存池的实现代码,里面带有个应用小例子和画的流程图,方便了解运行原理,代码 GCC 编译可用.可以自己上网下APR源码,参考代码下载链接: http://pan.baidu.com/s/1hq6A20G 贴两个之前学习的时候参考的文章地址,大家可以参考: http://www.cnblogs.com/bangerlee/archive/2011/09/01/2161437.html http://blog.csdn.net/flyingfalcon/article/details/2627

线程池学习笔记

记录一下学习线程池的过程,代码用到的函数归结: pthread_mutex_lock pthread_mutex_unlock pthread_cond_wait pthread_cond_signal pthread_cond_broadcast pthread_create pthread_join 程序中还用到了链表, 还有一个知识点:任何类型的数据都可以是void类型, 但void类型在使用之前必须进行强制类型转换. /* *Author:Greens_Ren *Description:

Java多线程回顾-线程池---学习笔记(三)

线程池产生原因: 创建很多线程造成的两个问题: 1.构建一个新的线程会涉及到与操作系统的交互,会消耗一定的系统资源,当使用完这些新创建的线程后,线程就会被销毁,然后当我们再创建的时候就会再次消耗系统资源,所以如果创建很多生命期很短的线程,就会消耗很大的系统资源,甚至给系统带来很大的压力. 2.现在不考虑重复创建很多线程造成的压力,单单从创建大量的线程并发执行任务这一点考虑,我们的系统能承受的线程数量是有限的,创建大量的线程会大大降低性能甚至是虚拟机崩溃. 所以这里为了解决创建多个线程造成的这两个

[原创]java WEB学习笔记80:Hibernate学习之路--- hibernate配置文件:JDBC 连接属性,C3P0 数据库连接池属性等

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

【转】JDBC学习笔记(8)——数据库连接池(dbcp&amp;C3P0)

转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 二.这种模式开发,存在的问题: 1)普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载进内存中,再验证用户名和密码(得花费0.05s~1s的时间).需要数据库连接

[原创]java WEB学习笔记109:Spring学习---spring中事物管理

博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ------------------------------------------------------------------------------------------------------------------

ufldl学习笔记与编程作业:Feature Extraction Using Convolution,Pooling(卷积和池化抽取特征)

ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl. 于是最近就开始搞这个了,教程加上matlab编程,就是完美啊. 新教程的地址是:http://ufldl.stanford.edu/tutorial/ 学习链接: http://ufldl.stanford.edu/tutorial/supervised/FeatureExtractionUsingConvolution