一种多线程应用程序访问数据库的方法技术

技术编号:2847691 阅读:226 留言:0更新日期:2012-04-11 18:40
本发明专利技术提供了一种多线程应用程序访问数据库的方法,预先建立不同的连接进行缓存,在不同连接里分别建立要使用的命令对象缓存入命令池,当某个线程访问数据库时,包括以下步骤:A、判断命令池中是否有未被调用的所述命令对象,若有,则执行步骤B,否则在一连接对象上建立所述命令对象;B、选择所述命令对象、命令对象所属的连接对象;C、该线程调用所选取的连接对象和命令对象访问数据库;在结束该调用时,释放命令对象回命令池。使用本发明专利技术,解决了多线程程序通过JDBC  API访问数据库阻塞问题,提高数据库的访问性能。

【技术实现步骤摘要】

本专利技术涉及数据库访问
,特别是指。
技术介绍
JDBCTMAPI是Java程序与数据库交互的一种应用程序接口,由一些Java语言编写的类和界面组成,用以使Java应用程序向数据库发送SQL语句以访问数据库。当然,要实现Java程序与数据库通讯,还需要加载JDBC驱动程序(JDBC Driver)(驱动程序可由DBMS厂商、或第三方厂商提供)。当Java程序已经加载了JDBC驱动后,就可以通过JDBC API提供的DriverManager类与数据库建立访问通道。在访问数据库过程中,JDBC API通过其DriverManager.getConnection()函数获得数据库连接(Connection),一旦获得了与数据库的连接(Connection),Java应用程序就可以通过JDBC API向数据库发送SQL语句,去检索或者操作数据库。同时参见图1示出的JDBC访问数据库的流程图,下面的斜体字部分示出了JDBC使用命令对象(Statement对象)执行数据库查询或者更新的基本逻辑//------调用getConnection()方法,获得一个与数据库的连接对象(Connection对象)------Connection con=DriverManager.getConnection()//------创建命令对象(Statement对象)并准备一个SQL语句,这里的SQL语句是被立即执行的语句Statement对象------Statement stmt=con.createStatement() /*查询SQL命令例子,其中aSQL是一个数据库查询命令*///------使用Statement对象执行查询qurey语句(为了执行Statement对象,被发送到数据库的SQL语句aSQL将作为参数提供给Statement对象),得到一个存储结果的ResultSet对象ResultSet results=prepStmt.executeQuery(aSQL)//-----从ResultSet读取数据,关闭该对象接口------results. close()/*更新SQL命令例子,其中bSQL是一个数据库更新命令*///------使用Statement对象执行更新update语句------int rowsAffected=prepStmt.execute Update(bSQL)//------关闭Statement对象接口------stmt.close()//------关闭连接------con.close()上面的例子中,使用Statement对象(命令的对象)执行SQL命令,SQL命令由数据库侧DBMS(数据库管理系统)接收后,执行该SQL命令时,DBMS要进行以下的步骤第一步骤解析接受到的SQL语句;第二步骤编译此SQL语句;第三步骤计划和优化数据获取的路径;第四步骤执行SQL命令并返回结果给请求端Statement对象。使用Statement对象实现数据库的访问的缺点是,当出现Statement对象执行SQL的命令被数据库DBMS再次调用时,DBMS还会重复上面的四个步骤,重复的解析、编译过程大大影响了访问数据库的性能。为了解决上述问题,在Statement对象接口技术的基础上发展出PreparedStatement对象(准备好的命令对象)接口技术。PreparedStatement对象包含已编译的SQL语句,这就是使语句“准备好”。包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参数。由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象。使用该技术,上面所述的DBMS所执行的前三步骤可以进行优化或者省略掉。同时参见图1示出的JDBC访问数据库的流程图,下面斜体字示出了JDBC一个使用PreparedStatement对象执行数据库查询或者更新的基本逻辑//------调用getConnection()方法,获得一个与数据库的连接对象(Connection对象)-----Connection con=DriverManager.getConnection()//------创建命令对象(Statement对象)并准备一个SQL语句,这里的SQL语句是被编译的语句PreparedStatement对象-----PreparedStatement prepStmt=con.prepareStatement(aSQL)prepStmt.setInt(1,integerParam)prepStmt.setString(2,stringParam)/*查询SQL命令例子,其中aSQL是一个数据库查询命令*/ResultSet results=prepStmt.executeQuery(aSQL)//-----从ResultSet读取数据------results.close()/*更新SQL命令例子,其中bSQL是一个数据库更新命令*/int rowsAffected=prepStmt.execute Update(bSQL)prepStmt.close()con.close()采用PreparedStatement对象技术实现上述优点来提高数据库访问的性能的关键技术其中之一是采用了连接池的策略。下面对目前采用的两种连接池技术进行具体说明。1、缓存Connection的连接池连接池用来缓存Connection对象,使用连接池,缓存入池中的Connection仅需创建一次,之后会得到重用,可避免重复创建连接所耗费的时间和资源。目前,DBMS厂商提供了JDBC API的DataSource和PooledConnection/XAConnection接口,可从这些接口中获得Connection并缓存到连接池。其中DataSource接口对象是典型的通过JNDI服务获取的实例。还包括如下示出的获得Connection的接口a、ConnectionPoolDataSource对象,可基于连接请求提供PooledConnection连接对象;b、XADataSource对象,可基于连接请求提供XAConnection连接对象。连接池可以通过预先与DBMS建立连接的方式建立(称之为热连接)或者向数据库发出第一个请求的时候建立(称之为懒连接),甚至两种方式结合获取(先获取部分热连接,当获取后续连接的平均时间增加的时候,继续用懒连接的方式创建连接并缓冲到内区)。2、缓存Connection和PreparedStatement对象的连接池不管PreparedStatement对象被应用程序在何时创建,都随同Connection一起缓存到连接池。这样,当PreparedStatement对象执行aSQL的命令被数据库DBMS再次调用时,与Connection一起缓冲到内存的编译后的PreparedStatement对象也可以连同Connection被应用程序再次使用,相对于仅连接的池化来说,进一步的,DBMS不需要重复解析SQL的步骤了。但是,目前使用所述连接池访问数据库的方式还是存在着如下的缺点1、对于多线程应本文档来自技高网...

【技术保护点】
一种多线程应用程序访问数据库的方法,预先建立到数据库的不同的连接并进行缓存,其特征在于,分别在所述不同连接里建立要使用的命令对象并缓存入命令池,当某个线程调用某连接和该连接上的命令对象访问数据库时,包括以下步骤:    A、判断命令池中是否有未被调用的所述命令对象,若有,则执行下一步,否则选择一个连接并在该连接上建立所述命令对象;    B、选择所述的命令对象和该命令对象所属的连接;    C、所述线程调用所选择的连接和命令对象访问数据库。

【技术特征摘要】
1.一种多线程应用程序访问数据库的方法,预先建立到数据库的不同的连接并进行缓存,其特征在于,分别在所述不同连接里建立要使用的命令对象并缓存入命令池,当某个线程调用某连接和该连接上的命令对象访问数据库时,包括以下步骤A、判断命令池中是否有未被调用的所述命令对象,若有,则执行下一步,否则选择一个连接并在该连接上建立所述命令对象;B、选择所述的命令对象和该命令对象所属的连接;C、所述线程调用所选择的连接和命令对象访问数据库。2.根据权利要求1所述的方法,其特征在于,所述分别在不同连接里建立要使用的命令对象的步骤包括从配置文件或者数据库配置项表中读取命令池的配置信息来构建命令池;所述配置信息包括要创建所述命令对象的数量;获取连接对象,根...

【专利技术属性】
技术研发人员:张前锋斯瑞佛尼郁建中商托斯
申请(专利权)人:华为技术有限公司
类型:发明
国别省市:94[中国|深圳]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1