JDBC是Java语言访问数据库的一种规范,一套规范的API接口。基于这些规范的接口和类,java程序员
可以访问不同类型的数据库,执行SQL语句进行数据库操作。
阅读JDK源码可以知道JDBC的操作都是基于java.sql(j2se)、javax.sql(J2EE)包中,都是一些接口类。
其类图大致如下:
由于市面上有着各种不同的数据库,JDBC规范采用了接口和实现分离的设计思想。各个数据库厂商根据
JDBC的规范实现自己的数据库驱动程序jar包。
这样程序员在数据库编程时通过统一的接口操作数据库更加灵活、方便。
JDBC驱动程序就是数据库厂商根据JDBC规范实现的JDBC实现类。JDBC驱动程序
有四种类型:
● 第一种类型的驱动程序是通过将JDBC的调用委托给其他编程接口来实现的,例如
ODBC。这种类型的驱动程序依赖于本地程序,便携性差。例如JDBC-ODBC桥接。
● 第二种类型的驱动程序部分基于java语言实现,驱动程序一部分的操作交由java实现,
其他部分委托给本地程序。便携性低。
● 第三种类型的驱动程序全部由java语言实现,该类型的驱动程序一般有某个中间件服务
器提供,这样客户端程序可以使用数据库无关的协议和中间件服务器进行通讯,中间
件服务器在将客户端的JDBC调用转发给数据库进行处理。连接池方式(JNDI)
● 第四种方式的驱动程序由Java实现,该类型的数据库包含了特定的数据库访问协议,
使得客户端可以和数据库直接进行通讯。JDBC直连方式。
对于数据库的连接现大多采用3、4两种方式,至于这两种方式优缺点,可以参考一下文章:
JDNI: http://blog.csdn.net/kiritor/article/details/8960942
文章中简要的介绍了JDNI连接池,值得一提的是连接池的方式对于并发访问下数据库连接
的管理更加方便合理。这里就不多提了,读者可自行查阅资料。
1、注册数据库驱动程序
2、得到数据库连接
3、执行SQL语句
4、处理结果集
5、关闭资源
其时序图情况如下:
对于JDBC编程中的具体操作这里就不在给出解释以及给出代码了。在简要的介绍了下JDBC
之后读者较为感兴趣的是JDBC对事务隔离的操作。
现如今的DBMS基本都支持事务处理,用来管理两个或多个事务同时对一个数据库进行操作时产生的
冲突。而且用户能够制定指定事物的隔离级别,DBMS进而根据用户指定的级别花费相应的"精力"来解决冲突。
我们知道在数据库并发访问的时候会带来一下三个问题:
★ 不可重复读:一次事务中读取同一个变量两次,但是由于另一事务的干预两次读取的值不一样。
★ 脏读:一次事务对数据进行了修改尚未提交,同时另一个事务也访问这个数据并使用了它
★ 幻读(影像读取):幻读师数据更新被覆盖或丢失,事务A、B同时对c值进行修改,若A先提交
,则事务A的更新由于被B覆盖而更改。
针对并发执行所产生的以上三种数据不一致的情况,JDBC提供了5中不同的事务隔离级别来解决
上述冲突问题。有些情况下我们对并发执行的数据要求并不高,一种情况就是我们允许幻读,却不允许不可
重 复读和脏读。
隔离级别的设置在于使DBMS使用最小的"精力"解决我们能够接受的数据不一致问题。也就是寻求
性能与数据一致性的平衡点。
目前常用数据库的JDBC实现对数据隔离级别的支持如下:
事务的隔离性越高,为避免事务冲突所花费的代价就也高。如图可以知道JDBC通过Connection接口定
义了5级隔离级别。在决定采用什么隔离级别之前,开发人员应该就性能和数据一致性需求之间进行权衡。
而且JDBC实际所能支持的隔离级别取决于DBMS的功能。
在JDBC编程中,用户可以通过创建的Connection对象使用
conn.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED)手动的更改隔离级别。新的
隔离级别将在该连接的剩余时间内生效。需要注意的是不要在事务的中途去修改隔离级别这会导致
事务立即提交。