`

DataSource接口,Connection pooling(连接池),分布式事务,RowSet介绍

    博客分类:
  • JDBC
阅读更多
一、DataSource接口是一个更好的连接数据源的方法:
  JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接。JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制。
  一个DataSource对象代表了一个真正的数据源。根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件。当一个DataSource对象注册到名字服务中,应用程序就可以通过名字服务获得DataSource对象,并用它来产生一个与DataSource代表的数据源之间的连接。
  关于数据源的信息和如何来定位数据源,例如数据库服务器的名字,在哪台机器上,端口号等等,都包含在DataSource对象的属性里面去了。这样,对应用程序的设计来说是更方便了,因为并不需要硬性的把驱动的名字写死到程序里面去。通常驱动名字中都包含了驱动提供商的名字,而在DriverManager类中通常是这么做的。如果数据源要移植到另一个数据库驱动中,代码也很容易做修改。所需要做的修改只是更改DataSource的相关的属性。而使用DataSource对象的代码不需要做任何改动。
  由系统管理员或者有相应权限的人来配置DataSource对象。配置DataSource,包括设定DataSource的属性,然后将它注册到JNDI名字服务中去。在注册DataSource对象的的过程中,系统管理员需要把DataSource对象和一个逻辑名字关联起来。名字可以是任意的,通常取成能代表数据源并且容易记住的名字。在下面的例子中,名字起为:InventoryDB,按照惯例,逻辑名字通常都在jdbc的子上下文中。这样,逻辑名字的全名就是:jdbc/ InventoryDB。
  一旦配置好了数据源对象,应用程序设计者就可以用它来产生一个与数据源的连接。下面的代码片段示例了如何用JNDI上下文获得一个一个数据源对象,然后如何用数据源对象产生一个与数据源的连接。开始的两行用的是JNDI API,第三行用的才是JDBC的API:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/InventoryDB");Connection con = ds.getConnection("myPassword", "myUserName");
  在一个基本的DataSource实现中,DataSource.getConnection方法返回的Connection对象和用DriverManager.getConnection方法返回的Connection对象是一样的。因为DataSource提供的方便性,我们推荐使用DataSource对象来得到一个Connection对象。我们希望所以的基于JDBC2.0技术的数据库驱动都包含一个基本的DataSource的实现,这样就可以在应用程序中很容易的使用它。
  对于普通的应用程序设计者,是否使用DataSource对象只是一个选择问题。但是,对于那些需要用的连接池或者分布式的事务的应用程序设计者来说,就必须使用DataSource对象来获得Connection,原因在下面我们会提到。
    二、Connection pooling(连接池):
  连接池是这么一种机制,当应用程序关闭一个Connection的时候,这个连接被回收,而不是被destroy,因为建立一个连接是一个很费资源的操作。如果能把回收的连接重新利用,会减少新创建连接的数目,显著的提高运行的性能。
  假设应用程序需要建立到一个名字为EmpolyeeDB的DataSource的连接。使用连接池得到连接的代码如下:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");Connection con = ds.getConnection("myPassword", "myUserName");除了逻辑名字以外,我们发现其代码和上面举的例子的代码是一样的。逻辑名字不同,就可以连接到不同的数据库。DataSource对象的getConnection方法返回的Connection是否是一个连接池中的连接完全取决于DataSource对象的实现方法。如果DataSource对象实现与一个支持连接池的中间层的服务器一起工作,DataSource对象就会自动的返回连接池中的连接,这个连接也是可以重复利用的。
  是否使用连接池获得一个连接,在应用程序的代码上是看不出不同的。在使用这个Connection连接上也没有什么不一样的地方,唯一的不同是在java的finally语句块中来关闭一个连接。在finally中关闭连接是一个好的编程习惯。这样,即使方法抛出异常,Connection也会被关闭并回收到连接池中去。代码应该如下所示:
  try{…
  }catch(){…
  }finally{ if(con!=null)con.close();}
  三、分布式事务:
  获得一个用来支持分布式事务的连接与获得连接池中的连接是很相似的。同样,不同之处在于DataSource的实现上的不同,而不是在应用程序中获得连接的方式上有什么不同。假设DataSource的实现可以与支持分布式事务中间层服务器一起工作,得到连接的代码还是如下所示:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB"); Connection con = ds.getConnection("myPassword", "myUserName");由于性能上的原因,如果一个DataSource能够支持分布式的事务,它同样也可以支持连接池管理。
  从应用程序设计者的观点来看。是否支持分布式的事务的连接对它来说没什么不同,唯一的不同是在事务的边界上(开始一个事务的地方和结束一个事务的地方),开始一个事务或者结束一个事务都是由事务服务器来控制的。应用程序不应该做任何可能妨碍服务的事情。应用程序不能够直接调用事务提交commit或者回滚rollback操作,也不能够使用事务的自动提交模式auto-commit mode(在数据库操作完成的时候自动的调用commit或者rollback)。

在一个连接参与了分布式事务的时候,下面的代码是你不能做的(con表示支持分布式事务的连接Connection)。
  con.commit();或者con.rollback();或者con.setAutoCommit(true);对于通常的Connection来说,缺省的是auto-commit模式。而对于支持分布式事务的Connection来说,缺省不是auto-commit模式。注意,即使Connection是支持事务的,它也可以用于没有事务的情况。关于事务边界的限制只是是对分布式事务的情况下才成立的。
  配置支持连接池的DataSource的时候,涉及到配置ConnectionPoolDataSource对象,这个对象是三层体系结构中的中间层来管理连接池的。同样的,在配置支持分布式事务的时候,需要配置XADataSource,XADataSource是中间层用来管理分布式事物的对象。ConnectionPoolDataSource和XADataSource是由驱动提供商提供的,对应用程序的设计者来说是透明的。和基本的DataSource一样,系统管理员来配置ConnectionPoolDataSource和XADataSource对象。
  四、结果集(RowSet接口):
  结果集对象是一行行数据的容器。根据其目的,可以通过多种方法实现。RowSet及其相关的接口与JDBC2.0的标准扩展API有点不同,他们并不是驱动的一部分,RowSet是在驱动的上层实现的,可以由其它的任何人来实现他们。
  任何类型的rowset都实现了RowSet接口,RowSet接口扩展了ResultSet接口。这样RowSet对象就有了ResultSet对象所有的功能。能够通过getXXX方法得到数据库中的某列值,通过updateXXX方法可以修改某列值,可以移动光标,是当前行变为另一行。
  当然,我们更感兴趣的是RowSet接口提供的新的功能。作为一个JavaBean组件,RowSet对象可以增加或者删除一个listener(监听者),可以get或者set其属性值,这些属性中,有一个是字符串,表示一个对数据库Query请求,RowSet接口定义了设定参数的方法,也提供了执行这个请求的方法。这意味着RowSet对象能够执行查询请求,可以根据它产生的结果集进行计算。同样,RowSet也可以根据任何表格数据源进行计算,所以,它不局限于关系数据库。
  从数据源得到数据之后,RowSet对象可以和数据源断开连接,rowset也可以被序列化。这样,RowSet就可以通过网络传递给瘦客户端。
  RowSet可以被重新连接到数据源,这样,做的修改就可以存回到数据源中去。如果产生了一个listener,当RowSet的当前行移动,或者数据被修改的时候,监听者就会收到通知。例如,图形用户界面组件可以注册成为监听者,当RowSet更改的时候,图形用户界面接到通知,就可以修改界面,来符合它所表示的RowSet。
  根据不同的需要,RowSet接口可以通过多种方法来实现。Java software已经写了一个CachedRowSet实现,从http://developer.java.sun.com/developer/earlyAccess/crs/index.html中可以得到这个实现。
  与CachedRowSet类不样的是,JDBCRowSet类总是保持一个和数据源的连接。这样,在ResultSet外围简单到加了一层,是基于JDBC技术的驱动看起来象是一个简单的JavaBean组件一样。

  总结:JDBC2.0标准扩展API通过见DataSource注册到JNDI名字服务上,将JDBC技术扩展为一个全新的概念。使应用程序的代码更加精巧,易于控制。新的API支持了连接池,支持分布式的事务。最后,还使java应用程序可以在网络上传播结果集,是不可以滚动的ResultSet变成了可以滚动的RowSet。
分享到:
评论

相关推荐

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    分布式事务实践 解决数据一致性

    介绍分布式事务的定义、原则和实现原则,介绍使用Spring框架实现分布式事务的几种方式,包括使用JTA、Spring事务同步、链式事务等,并通过实战介绍其实现。除此以外还介绍了一些分布式事务相关的技术,如幂等性、...

    Spring2.5实现事务管理(本地事务、分布式事务).doc

    数据源(dataSource)是指对数据库的连接,在这个例子中,我们使用 Apache Commons DBCP 库来管理数据库连接池。 事务管理器(txManager)是指 Spring 框架提供的事务管理器,它负责管理事务的提交、回滚和重试。 ...

    数据源和连接池

    在实际项目的开发中,特别是web应用程序中,如Jsp,Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据方请求必须建立连接,存取数据,关闭连接等步骤,而数据库连接是一种非常昂贵的资源,频繁的建立连接,...

    【分布式事务----LCN】LCN原理及使用方式.docx

    TxClient的代理连接池实现了javax.sql.DataSource接口,并重写了close方法,事务模块在提交关闭以后TxClient连接池将执行"假关闭"操作,等待TxManager协调完成事务以后在关闭连接。 对于代理连接池的优化 自动超时...

    分包数据源(全局分布式事务).rar

    SpringBoot2实现tjta.atomikos.AtomikosDataSource分布式事务动态切换数据源

    JavamyDbPoolUse.rar 连接池

    BasicDataSource创建DataSource(DBCP连接池配置) ComboPooledDataSource(C3P0连接池配置) Apache的DBUtils框架使用 ----------------------------------------------- BasicDataSource创建DataSource(DBCP连接池配置...

    DataSource接口介绍与使用

    JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接。JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制。

    springboot分布式事务解决方案LCN

    本文来自于csdn,将从原理,调用...TxClient的代理连接池实现了javax.sql.DataSource接口,并重写了close方法,事务模块在提交关闭以后TxClient连接池将执行"假关闭"操作,等待TxManager协调完成事务以后在关闭连接。

    多数据源动态切换及XA分布式事务Java实现v1.0.zip

    使用Atomikos支持分布式事务,Spring+Mybatis+Druid+AtomikosDataSource 使用手册: https://www.yuque.com/itman/wosfkn/mreame

    关于数据库连接池和动态数据源的实现

    数据源连接池的基本用法,配置信息,代码案例、 实现数据源的动态切换和案例 数据源连接池的基本用法,配置信息,代码案例、 实现数据源的动态切换和案例 数据源连接池的基本用法,配置信息,代码案例、 实现...

    JDBC专题(七)-数据库连接池 DataSource Pool.docx

    开源数据库连接池(第三方企业中使用的连接池) 4.1.DBCP数据源 4.2.C3P0连接池 4.3.Druid连接池 4.3.1.druid连接池的使用 1.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而...

    阿里巴巴数据库连接池完整demo

    阿里巴巴数据库连接池应该是目前最好的数据库连接池:大并发稳定,操作数据库效率高。此demo不仅有和spring整合的例子,还有单独配置的实例,供大家学习掌握

    学习有关连接池的使用

    auth="Container” type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="sa" password="120010" driverClassName="com.microsoft. sqlserver. jdbc.SQLServerDriver" url=...

    阿里巴巴的开源项目JDBC连接池、监控组件 Druid.zip

     DruidDataSource 高效可管理的数据库连接池。 SQLParser Druid可以做什么? 1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问...

    使用JAVA连接池作的数据库增删改查

    JAVA,连接池,数据库增删改查,分层设计

    访问SQLServer - springboot自定义DBUtil(druid连接池)操作SQLServer数据库

    Spring-Boot通过druid连接池获取连接操作SQLServer数据库 总结:【共3步】 第1步:添加druid和MSSQL Driver的依赖项; 第2步:配置连接字符串; 第3步:创建数据库操作类,使用@Bean注入DruidDataSource, 然后根据...

    Druid数据库连接池Jar包

    Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署...

    Druid简单高性能MySQL连接池

    用阿里巴巴Druid实现的一个简单连接池,高性能,高并发。

    druid数据库连接池

    druid-1.0.9数据库连接池技术,由阿里巴巴提供。使用步骤: 1.导入jar包:druid-1.0.9.jar 2.定义配置文件:druid.properties,可取任意名称,放任意路径 3.获取数据库连接池对象:DruidDataSourceFactory 4....

Global site tag (gtag.js) - Google Analytics