JDBC高级应用三
再谈JDBC连结
为什么要反复谈JDBC连结,因为所以JDBC的性能,最主要的就是JDBC连结,而SQL语句的
优化,和JAVA编程无关,你的一个查询语句的效率,是你对于SQL语法的使用技巧,这一方
面你就可请教DBA,而不是来看我这种程序设计者的文章.
我们已经知道,取得数据库连结,有几种层次的实现方法,一是直接得到物理连结,而是通
过传统的连结池(没有多大区别),三是通过java的扩展包javax.sql.DataSource得到连结
句柄,对于上面两种,没有什么可以多说的,对于DataSource,我们再深入一些.
一般来说,DataSource是容器本身作为一个JDNI查找的对象返回出来的,也就是说要依赖
容器进行配置,而如果一个100%的应用程序(Application),比如基于swing的App,我根本
不需要运行容器,那我如何取得DataSource对象?这时可能要你自己写基于DataSource的
连结池了(是不是有些太深入了?要做就做高手,SUN能做我们就能做).
如果自己要实现DataSource,要清楚几个关系,即DataSource中返回的Connection是一个连
结的句柄,它要和实际的物理连结关连,这些实际的物理连结就是PooledConnection,我们
叫它池中的连结,可以通过实现ConnectionPoolDataSource,从中得到PooledConnection,
这部分本来是厂商实现的,但这部份实现和传统的连结池没有什么大的区别,主要是从
ConnectionPoolDataSource中得到PooledConnection的物理连结,但如何从PooledConnection
中getConnection(),返回给用户.这部分实现就是DataSource实现的性能高低的关键,一般
来说,我们可以先把一个物理连结PooledConnection和多个客户连结相关连来增加性能,也
就是一个PooledConnection本身再作为一个工场的种子,通过一个PooledConnection再返回
多个Connection,说白了就是多个Connection的请求通过一个PooledConnection传递给数据库.
只要用户调用Connection的close()方法,就打断这个Connetion与PooledConnection的关联而
让PooledConnection可以和新的Connection进行关联.
JDBC事务
JDBC1开始,就支持本地事务,所谓要地事务,就是在一个连结中的多个操作可以作为一个事务
过程来提交.注意,只要你使用conn.setAutoCommit(false);方法就隐式地打开了一个事务.当
事务被commit或abort时,隐含的是打开了一个新的事务.
另外,当一次事务被commit或abort,PreparedSattement和CallableStatement绑定的结果集全
部被关闭,而普通的Statement绑一的结果集将被维持.
在处理多个操作时:
conn.setAutoCommit(false);
Statementst1=conn.createSatatement(sql1);
Statementst2=conn.createSatatement(sql2);
Statementst3=conn.createSatatement(sql3);
Statementst4=conn.createSatatement(sql4);
st1.executeXXXXX();
st2.executeXXXXX();
st3.executeXXXXX();
st4.executeXXXXX();
在这里,我们要么把四个操作一起回滚,或一起提交,但如果我们认为,1-3的操作是要求一致完
成,而4的操作在一至三完成时再完成.在经前的版本中我们要把它们分开在两次事务中,但在
JDBC3.0以后,我们可以利用conn.setSavepoint()来得到一个SavePoint来对同一事务中不同阶
段进行断点保存.然后可以在任何断点上进行提交和回滚.同时我们还可以利用
conn.setTransactionIsolation()来设置隔离级别.
要注意的是,对事务的支持要看数据库的具体实现.如果数据库本身不支持事务,那么以上的操作
都是无效的,可以从DatabaseMetaData中查询数据库对事务的支持情况.
毕竟,本地事务功能并不是很强,而如果不是编程人员对SQL语句传入错误,那么在一次连结中
多个操作只完成部份的机率并不容易发生(当然有时还会发生的,要不本地事务就不会产生了).
其实,JDBC事务最重要的是分布式事务,即同时操作不同的连结,可能是同物理库的不同空间,也
可能是同一主机的不同数据库或不同主机的多个数据库.这就很难保证每个操作都是成功的,发
生操作不一致的机会太多了,可以说如果不在事务中测试你就无法相信操作的一致性.所以分布
式事务是JDBC的重要技术.
在下一节我们重点介绍JDBC分布式事务.