发表于: 2018-03-27 21:05:23
1 552
今天完成的事情:
1.完成对事务处理,连接池概念的学习,并练习JDBC部分
事务处理:(简单说就是让sql增删改查语句要么全部成功,要么全部失败的一种方法,不会发生,后边的操作失败,前边的操作却已经改变数据库的情况,我们平时删除文件时,给我们确认删除的提醒就是这种情况)
事务是保证底层数据完整的重要手段,没有事务支持的数据库应用,那将非常脆弱
事务:
是由一步或几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行
一段程序中可能包含多个事务
事务的四个特性:
原子性——事务时应用中最小的隔离单元,时不可再分的最小逻辑执行体
一致性——事务执行的结果,让数据库保持一致性,从一个一致性状态,变到另一个一致性状态
隔离性——各事务的执行互不打扰,我的操作过程对你时隔离的
持续性——事务一旦提交,对数据做的改变会记录到永久存储器,通常时保存进物理数据库
数据库的事务由下列语句组成
一组DML语句
一条DDL语句——会导致事务立即提交
一条DCL语句——同上
事务的操作全部成功执行后,应提交(commit)事务,使这些修改永久生效
显性提交:使用commit
自动提交:执行DDL或DCL语句,或者程序正常推出
事务中的任何一个数据库操作失败后,要执行回滚(rollback)事务
显示回滚:rollback
自动回滚:系统错误或者强行退出
MySQL默认时关闭事务的(即打开自动提交)
要开启MySQL的事务支持,可以显示调用如下命令:
SET AUTOCOMMIT = (0 | 1) //0为关闭自动提交,也就是开启事务
当我们不想回滚全部事务的时候,可以用savepoint设置事务的中间点,
可以让事务回滚到中间点
(在版本更新出现问题的时候,可以回滚到我们想要回到的版本)
savepoint a; //设置中间点
rollback to a; //回滚到指定中间点
JDBC的事务支持
JDBC连接的事务由Connection提供,Connection默认打开自动提交,即关闭事务
可以调用Connection的commit()方法来提交事务
conn.commit();
调用Connection的rollback()方法来回滚事务
conn.rollback();
当Connection遇到一个未处理的SQLException异常时,系统将会非正常退出,事务也会回滚。
但如果程序捕获了该异常,则需要在异常处理块中显式地回滚事务。
Connection的设置中间点调用方法setSavepoint()
Savepoint setSavepoint(); 在当前事务中创建一个未命名的中间点
Savepoint setSavepoint(String name); 常见一个有指定姓名的中间点
rollback(Savepoint savepoint); 该方法回滚到指定中间点
使用连接池管理连接
数据库连接的建立及关闭是极耗费系统资源的操作,十分影响系统性能
我们通过DriverManager获取连接,每次操作都打开一个物理连接,使用完后立即关闭连接
这种频繁的打开、关闭连接将造成系统性能的低下。
数据库连接池的解决方案:
当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池。
每次应用程序请求数据库连接时,无须重新打开连接,而是从连接池中取出已有的连接使用,
使用完后不关闭数据库连接,而是还给连接池
从而大大提高程序的巡行效率
类似于我们平时图书馆,借书,还书,而不需要去新买书,和处理书。
明天计划的事情:
1.开始学习MyBatis
遇到的问题:
收获:
1.对事务处理和连接池更明白了
2..try-with-resources语句(好处就是i使用的资源,可以自动释放)
y-with-resources语句是一种声明了一种或多种资源的try语句。资源是指在程序用完了之后必须要关闭的对象。try-with-resources语句保证了每个声明了的资源在语句结束的时候都会被关闭。
任何实现了java.lang.AutoCloseable接口的对象,和实现了java.io.Closeable接口的对象,都可以当做资源使用。
在使用事务时,不能使用try-with-resources语句,因我们不让它自动结束事务
2.使用预编译和不使用预编译,插入多条SQL语句,可以明显的看出预编译的性能优化情况
在多次使用同一条SQL语句时,使用预编译,其实就是SQL语句和参数的分离,通过多次传参,然后一次执行。
评论