笔记:JDBC(二)——批处理/事务/链接池

1、批处理html

    概念:将向数据库表一次性插入多条记录,而不是一条一条插入的方式,这样能够提供效率。java

    实现方法:sql

                executeBatch():向MySQL数据库发送一批SQL语句
                addBatch():将当前SQL语句添加到Statement对象中
                clearBatch():释放Statement对象中的SQL语句
  • Statement批处理,该类提供以下方法用于批处理操做。

方法摘要数据库

voidapache

addBatch(String sql)
将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。编程

void数组

clearBatch()
清空此 Statement 对象的当前 SQL 命令列表。tomcat

int[]服务器

executeBatch()
将一批命令提交给数据库来执行,若是所有命令执行成功,则返回更新计数组成的数组。多线程

 
  • PreparedStatement批处理,该类提供以下方法用于批处理操做。

方法摘要

void

addBatch()
将一组参数添加到此 PreparedStatement 对象的批处理命令中。

 
2、事务
    定义:访问并可能更新数据库中各类数据项的一个程序执行单元。
 
     四大特色(简称ACID):
      原子性(Atomicity):一个事务不可分割的工做单位,事务中包括的诸操做要么都执行(成功),要么都不执行(失败)。
      一致性(Consistent):事务必须是使数据库从一个一致性状态变到另外一个一致性状态,一致性与原子性是密切相关的。
      隔离性(Isolation):一个事务执行不能被其余事务干扰。
      持久性(Durability):持久性也称为永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
 
 
3、MySQL事务
    概念: MySQL对事物的管理,在默认状况下,MySQL每执行一条SQL语句,就会将这条SQL语句视为一个单独的事物。若是在多条SQL语句在一个事物的状况下,MySQL默认状况是没法完成的。
  • start transaction命令:表示开启事务。
  • rollback命令:表示回滚事务。若是选择回滚事务的话,数据将恢复到事物开启以前的状态。
  • commit命令:表示提交事务。若是选择提交事务的话,数据更新以后将没法恢复。

 

4、JDBC事务
    

  上面是在MySQL数据库中管理事务,在实际开发中,更可能是在Java代码中管理MySQL的事务。也就是说,是利用JDBC来管理MySQL事务。JDBC提供以下三种方法来管理MySQL事务:

方法摘要

void

commit()
使自从上一次提交/回滚以来进行的全部更改为为持久更改,并释放此 Connection 对象当前保存的全部数据库锁定。

void

rollback()
取消在当前事务中进行的全部更改,并释放此 Connection 对象当前保存的全部数据库锁定。

void

setAutoCommit(boolean autoCommit)
将此链接的自动提交模式设置为给定状态。

 

    MySQL事务的回滚操做,默认是回滚到开启事务以前的数据状态。但在实际开发中,常常须要数据回滚到某个指定的执行状态。MySQL提供了回滚点(Savepoint)的概念,回滚点相似于游戏中的存档。也就是说,设置回滚点后,能够将事务回滚到指定某个回滚点的数据状态。下表是回滚点提供的相关方法:

方法摘要

void

releaseSavepoint(Savepoint savepoint)
从当前事务中移除给定 Savepoint 对象。

void

rollback(Savepoint savepoint)
取消设置给定 Savepoint 对象以后进行的全部更改。

Savepoint

setSavepoint()
在当前事务中建立一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象。

Savepoint

setSavepoint(String name)
在当前事务中建立一个具备给定名称的保存点,并返回表示它的新 Savepoint 对象。

 
5、事务隔离级别  

  在平常MySQL的事务管理中,若是多线程开启各自事务操做,而数据库不负责隔离操做时,常常会出现如下三种常见问题:

  • 脏读:指一个事务读取到另外一个事务未提交的数据记录。

脏读这种操做在实际是很是危险的。例如若是B给A转帐10000元钱,B开启一个事务用于转帐10000元,实际操做后并未提交事务。若是此时A查询本身的帐户会发现已经收到B转帐的10000元,当A作出实际动做(发货)后,B再将事务回滚,最终致使A损失10000元钱。

  • 不可重复读:指一个事务中读取指定表中的某一条数据,屡次读取结果不一样。

例如若是A第一次查询帐户为20000元钱后,B向A转帐10000元钱,A在第二次查询帐户为30000元钱。先后两次查询结果不一致,A可能不知道多出的10000元钱是来自哪里。

不可重复读与脏读的区别在于脏读读取的是前一事务未提交的数据,而不可重复读读取的是前一事务提交的数据。

  • 幻读(虚读):指一个事务中读取到另外一个事务插入的数据,致使先后读取结果不一致。

例如酒店统计房间预订数量时,第一次统计为101间被预订,A在酒店第一次统计后,预订了110房间,酒店在A成功预订110房间后第二次统计,结果为102间被预订。致使酒店先后统计数量不一致。

幻读与不可重复读的区别在于不可重复读读取的是另外一个事务的更新操做,而幻读读取的是另外一个事务的插入操做(MySQL数据库没法测试到幻读问题)。

针对上述的三个问题,MySQL数据库提供了四大隔离级别来解决,这四大隔离级别分别为:

  • SERIALIZABLE(串行化)

这个隔离级别可避免脏读、不可重复读、虚读状况的发生。

  • REPEATABLE READ(可重复读)

这个隔离级别可避免脏读、不可重复读状况的发生。

  • READ COMMITTED(读已提交数据)

这个隔离级别可避免脏读状况发生。

  • READ UNCOMMITTED(读未提交数据)

这个隔离级别最低级别,以上状况均没法保证。

  • 四个隔离级别的优先级:

SERIALIZABLE –> REPEATABLE READ -> READ COMMITTED -> READ UNCOMMITTED

  • 四个隔离级别的性能:

READ UNCOMMITTED -> READ COMMITTED -> REPEATABLE READ -> SERIALIZABLE

 
7、数据库链接池
  概述:链接池是建立和管理一个链接的缓冲池的技术,这些链接准备好被任何须要它们的线程使用。这种把链接“聚集”起来的技术基于这样的一个事实:对于大多数应用程序,当它们正在处理一般须要数毫秒完成的事务时,仅须要可以访问JDBC链接的 1 个线程。当不处理事务时,这个链接就会闲置。相反,链接池容许闲置的链接被其它须要的线程使用。

链接池能够极大的改善用户的 Java 应用程序的性能,同时减小所有资源的使用。链接池主要的优势有:

  • 减小链接建立时间。
  • 简化的编程模式。
  • 受控的资源使用。
  常见的第三方链接池:
    一、DBCP     

      DBCP(DataBase connection pool),数据库链接池。是 apache 上的一个 java 链接池项目。单独使用dbcp须要3个包:commons-dbcp.jar,commons-pool.jar,commons-collections.jar因为创建数据库链接是一个很是耗时耗资源的行为,因此经过链接池预先同数据库创建一些链接,放在内存中,应用程序须要创建数据库链接时直接到链接池中申请一个就行,用完后再放回去。

    二、C3P0

      C3P0是一个开源的JDBC链接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

      C3P0与DBCP的区别:

              dbcp没有自动回收空闲链接的功能。

          c3p0有自动回收空闲链接功能。

    三、JNDI

     NDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,经过不一样的访问提供者接口JNDI API的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序能够和这些命名服务和目录服务之间进行交互。集群JNDI实现了高可靠性JNDI,经过服务器的集群,保证了JNDI的负载平衡和错误恢复。在全局共享的方式下,集群中的一个应用服务器保证本地JNDI树的独立性,并拥有全局的JNDI树。每一个应用服务器在把部署的服务对象绑定到本身本地的JNDI树的同时,还绑定到一个共享的全局JNDI树,实现全局JNDI和自身JNDI的联系。

JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各类命名和目录服务的通用、统一的接口,相似JDBC都是构建在抽象层上。

JNDI(Java Naming and Directory Interface)是容许将一个Java对象绑定到一个JNDI容器(tomcat)中 ,而且为对象指定一个名称,经过javax.naming 包 Context 对JNDI 容器中绑定的对象进行查找,经过指定名称找到绑定Java对象。

相关文章
相关标签/搜索