CN101980207A - 一种数据库访问的实现方法和*** - Google Patents
一种数据库访问的实现方法和*** Download PDFInfo
- Publication number
- CN101980207A CN101980207A CN201010536532.9A CN201010536532A CN101980207A CN 101980207 A CN101980207 A CN 101980207A CN 201010536532 A CN201010536532 A CN 201010536532A CN 101980207 A CN101980207 A CN 101980207A
- Authority
- CN
- China
- Prior art keywords
- bucket
- statement
- database
- data
- database access
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 114
- 230000008569 process Effects 0.000 claims description 26
- 230000014759 maintenance of location Effects 0.000 claims description 7
- 230000001360 synchronised effect Effects 0.000 claims description 6
- 230000005059 dormancy Effects 0.000 claims description 5
- 230000007246 mechanism Effects 0.000 claims description 4
- 230000004044 response Effects 0.000 claims description 4
- 238000010586 diagram Methods 0.000 description 13
- 230000006870 function Effects 0.000 description 8
- 238000013507 mapping Methods 0.000 description 6
- 238000004590 computer program Methods 0.000 description 5
- 238000007726 management method Methods 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 3
- 230000005856 abnormality Effects 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000013500 data storage Methods 0.000 description 2
- 238000012423 maintenance Methods 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 241001269238 Data Species 0.000 description 1
- 230000002159 abnormal effect Effects 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000013480 data collection Methods 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 230000018109 developmental process Effects 0.000 description 1
- 238000005538 encapsulation Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000011514 reflex Effects 0.000 description 1
- 230000033772 system development Effects 0.000 description 1
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开一种数据库访问的实现方法和***,包括:将同一类的SQL组成一个Bucket实例;在数据访问配置文件中配置各SQL以及Bucket;如果进行非跨语句的数据库访问,则通过borrowStatement()接口方法获取Pooled Statement;如果进行跨语句的数据库访问,则通过borrowBucket()接口方法获取Bucket,通过Bucket提供的getStatement()方法逐一获得其中的Pooled Statement;使用Pooled Statement提供的接口方法进行本次数据库访问的数据操作。本发明可以为海量数据的分布式***提供高可用、高性能、成本低廉、易管理和调优的数据访问层实现。
Description
技术领域
本发明涉及信息应用技术,特别是指一种数据库访问的实现方法和***。
背景技术
数据访问技术是海量数据的分布式***中要考虑的一个重点问题。
目前的数据存储一般采用关系型数据库,在用Java实现中,关系型数据库到Java对象之间的转换称为O-R Mapping,目前已存在很多O-R Mapping的方案,其中开源的如Hibernate(对象关系映射框架)。
对于高可用、高性能要求的海量数据的分布式***,这些已有的实现一般存在如下不足:
1、难以针对应用的特点对不同的读、写特征以及不同的优先级别的数据库连接进行优化,比如一类数据库访问独享数据库连接资源,几个写的语句共用一个数据库连接;某些数据库连接一直保持,另一些数据库连接尽快释放等。
2、SQL(Structured Query Language,结构化查询语言)语句没有被集中配置,难以进行SQL语句级别的调优、故障分析以及集中的数据库访问语句的管理,***开发的管理人员和数据库管理人员难以用一种集中的方式对访问数据库的SQL进行管理和调优。
3、采用Java的反射机制(reflect)实现O-R Mapping,存在较大的性能消耗,不能满足对性能要求特别高的***的要求。
4、在高可用的海量数据的分布式***中,一般需要数量很多的数据库服务器,有时甚至成千上万台,而且数据有多个拷贝。在这种情况下,不能完全依赖数据库***的海量存储功能,需要数据库访问层提供相应的支持,一般的已有实现这方面的支持不够灵活,如没有提供多种分布写的策略。
5、跨语句的事务管理依赖应用服务器的实现,性能消耗较大。
发明内容
有鉴于此,本发明的目的在于提出一种数据库访问的实现方法和***,为海量数据的分布式***提供高可用、高性能、成本低廉、易管理和调优的数据访问层实现。
基于上述目的本发明提供的一种数据库访问的实现方法,包括:
对SQL进行分类;
在数据访问配置文件中配置各Bucket,一个Bucket中包括同一类的SQL以及该Bucket的数据库连接;
如果进行非跨语句的数据库访问,则通过borrowStatement()接口方法获取Pooled Statement;如果进行跨语句的数据库访问,则通过borrowBucket()接口方法获取Bucket,通过Bucket提供的getStatement()方法逐一获得其中的Pooled Statement;
使用Pooled Statement提供的接口方法进行本次数据库访问的数据操作。
可选的,该方法中如果进行非跨语句的数据库访问,则通过borrowStatement()接口方法,根据语句id来获取Pooled Statement;如果进行跨语句的数据库访问,则通过borrowBucket()接口方法,根据语句Bucket id来获取Bucket。
可选的,该方法中通过一个二维数组来管理Bucket实例,第一维为Bucket实例所属的Bucket类型,第二维为该实例占用的数据库连接;
调用者通过borrowStatement()或borrowBucket()方法申请语句或Bucket时,传入的参数为“Bucket id”或“语句id”,池管理器操作过程如下:
如果参数为“语句id”,则通过一个索引转化为Bucket id。
根据Bucket id在Bucket池中找到属于该Bucket类型的所有Bucket实例,即一个一维数组;
扫描该数组,如果找到一个“空闲”的Bucket实例,标记为“在用”,如果调用者申请的是Bucket,则把该实例返回;如果申请的是语句,则根据“语句id”在该Bucket实例包含的语句中找到该语句返回;如果找不到“空闲”的Bucket实例,则过程休眠一段时间等待,如果等待时间之后,还找不到“空闲”的实例,则抛出表示“忙”的异常响应。
可选的,该方法中通过returnMe()方法归还Pooled Statement或Bucket。
可选的,该方法进一步包括:一次数据库访问所需的所有Bucket在一个数据访问配置文件中集中配置。
可选的,该方法所述数据访问配置文件采用Java的Properties文件,语句的配置形式为“语句id=SQL”,Bucket的配置形式如下:
包含的语句:class[bucket id].stmts=逗号隔开的多个语句id,定义了Bucket中包括的SQL语句;
最多可以用的数据库连接数:class[bucket id].conn=最多可以用的数据库连接数;
数据库连接是否可写:class[bucket id].update=true/false,默认为false,即只读。
可选的,该方法如果所述数据库访问为写操作,则采用如下三种方式之一执行:
只写一个数据库:数据只写到一个数据库即完成;
多个数据同步写:数据要成功的写到多个数据库,事务才算成功;
多个数据库异步写:先尝试把数据写到多个数据库中,如果成功,则事务成功完成;如果失败,则选择其中一个数据库写,并记录该数据需要同步到其他数据库中,由后台的同步机制进行事后的数据同步。
可选的,该方法中当数据库访问过程中出现异常时,调用者不归还Pooled Statement或Bucket,将对出错的数据库进行标记,拒绝再对其进行写操作。
可选的,该方法在所述数据访问配置文件中指定语句的空闲保持时间,如果超出该空闲保持时间语句仍没有被使用,则回收该语句的资源;如果一个Bucket实例中的所有语句都被回收,则该Bucket实例连同其使用的数据连接都会被回收。
在本发明的另一方面,还提供了一种数据库访问的实现***,包括:
接口模块,用于提供数据库访问的接口,对于非跨语句的数据库访问,提供borrowStatement()接口方法获取Pooled Statement;对于跨语句的数据库访问,提供borrowBucket()接口方法获取Bucket;
Bucket模块,将同一类的SQL组成一个Bucket实例;提供getStatement()方法用于获得Pooled Statement模块的PooledStatement;
Pooled Statement模块,提供的接口方法进行数据库访问的数据操作;
连接及语句池管理模块,用于管理连接和SQL语句池;
分布式数据库存储器,用于存储数据库的数据。
可选的,该***所述接口模块,如果进行非跨语句的数据库访问,则通过borrowStatement()接口方法,根据语句id来获取PooledStatement;如果进行跨语句的数据库访问,则通过borrowBucket()接口方法,根据语句Bucket id来获取Bucket。
可选的,该***所述Bucket模块,通过一个二维数组来管理Bucket实例,第一维为Bucket实例所属的Bucket类型,第二维为该实例占用的数据库连接;
调用者通过borrowStatement()或borrowBucket()方法申请语句或Bucket时,传入的参数为“Bucket id”或“语句id”,池管理器操作过程如下:
如果参数为“语句id”,则通过一个索引转化为Bucket id。
根据Bucket id在Bucket池中找到属于该Bucket类型的所有Bucket实例,即一个一维数组;
扫描该数组,如果找到一个“空闲”的Bucket实例,标记为“在用”,如果调用者申请的是Bucket,则把该实例返回;如果申请的是语句,则根据“语句id”在该Bucket实例包含的语句中找到该语句返回;如果找不到“空闲”的Bucket实例,则过程休眠一段时间等待,如果等待时间之后,还找不到“空闲”的实例,则抛出表示“忙”的异常响应。
可选的,该***所述接口模块,通过returnMe()方法归还PooledStatement或Bucket。
从上面所述可以看出,本发明提供的数据库访问的实现方法和***,有以下优点:
SQL和数据库连接在一个数据访问配置文件中集中配置,配置文件采用Java的properties文件,SQL的配置形式如“语句id=SQL”。
SQL被分类,同一类的SQL被组成Bucket,Bucket可以被实例化,一个Bucket实例包含属于该Bucket的SQL语句实例,一个Bucket实例中的语句实例共享数据库连接,可以完成跨语句的事务。不同的Bucket使用不同的数据库连接,为每个Bucket指定分配的最大的数据库连接数,以及连接的属性,如读或写、保持连接的时间等。Bucket也在数据访问配置文件中集中配置,形式如“逗号隔开的多个语句id”。
不需要使用Java reflect来完成O-R Mapping,以取得更好的性能。
编程模式方面:所有的数据访问必须在数据访问配置文件中集中配置,不允许数据访问配置文件之外的程序和配置文件中出现SQL。
附图说明
图1为本发明实施例数据库访问实现方法的流程示意图;
图2为本发明另一实施例的数据库访问的流程示意图;
图3为本发明实施例生成的一个数据访问配置文件的示意图;
图4为本发明实施例数据库访问的实现***的结构示意图;
图5为本发明实施例非跨语句访问过程的流程示意图;
图6为本发明实施例跨语句访问过程的流程示意图。
具体实施方式
以下参考根据本发明的一个实施例的方法、装置(即***)和计算机程序产品的框图和流程图描述本发明。要理解框图和流程图的每个块以及框图和流程图中的块的组合分别可由计算机程序指令实现。这些计算机程序指令可被加载到通用计算机、专用计算机或其他可编程数据处理装置上,以产生产品,以便在计算机或其他可编程数据处理装置上执行的指令产生用于执行***或流程图块中指定的框图的装置。
这些计算机程序指令也可被存储在计算机可读存储器中,该计算机可读存储器可指导计算机或其他可编程数据处理装置按特定方式工作,以便存储在计算机可读存储器中的指令产生一件产品,其中包含实现一个或多个流程图块中指定的功能的指令装置。计算机程序指令也可被加载到计算机或其他可编程数据处理装置上,以致使一系列操作步骤在计算机或其他可编程装置上被执行,以产生计算机实现的过程,以便在计算机或其他可编程装置上执行的指令提供用于实现一个或多个流程图块中指定的功能的步骤。
因此,框图和流程图的块支持用于执行指定功能的装置的组合、用于执行指定功能的步骤的组合以及用于执行指定功能的程序指令装置。还要理解,框图和流程图的每个块以及框图和流程图中的块的组合可由执行指定功能或步骤的基于硬件的专用计算机***或专用硬件和计算机指令的组合实现。
参见图1所示,本发明提供的数据库访问的实现方法,主要包括:
步骤101,对SQL进行分类;
步骤102,在数据访问配置文件中配置Bucket,配置后的Bucket中包括同一类的SQL和数据库连接,同一类的SQL划分入一个Bucket实例;
步骤103,在进行数据库访问时,如果进行非跨语句的数据库访问,则通过borrowStatement()接口方法获取Pooled Statement;如果进行跨语句的数据库访问,则通过borrowBucket()接口方法获取Bucket,通过Bucket提供的getStatement()方法逐一获得其中的PooledStatement;
步骤104,使用Pooled Statement提供的接口方法进行本次数据库访问的数据操作。
作为一个实施例,将一次数据库访问所需要的多个Bucket(包含SQL和数据库连接)在一个数据访问配置文件中集中配置,配置文件采用Java的properties文件,SQL的配置形式如“语句id=SQL”。编程模式方面:所有的数据访问必须在数据访问配置文件中集中配置,不允许数据访问配置文件之外的程序和配置文件中出现SQL。由于SQL及数据库连接在数据访问配置文件中集中配置,使得软件的开发和维护人员(包括数据库管理员)对***中对数据的操作一目了然,方便进行管理和调优。此外,本发明实施例由于将SQL和数据库连接放到一个配置文件里面,这样用户可以通过修改配置文件来进行***配置,从而为***配置提供了一个很方便的途径,可以通过修改这个配置文件中SQL,使***访问不同的数据,得到不同的实体对象。这个配置还可以通过数据库的存储过程进行非常复杂的扩展。
作为一个实施例,将SQL分类,同一类的SQL被组成Bucket,Bucket可以被实例化,一个Bucket实例包含属于该Bucket的SQL语句实例,一个Bucket实例中的语句实例共享数据库连接,可以完成跨语句的事务。不同的Bucket实例使用不同的数据库连接,为每个Bucket实例指定分配的最大的数据库连接数,以及连接的属性,如读或写、保持连接的时间等。Bucket也在数据访问配置文件中集中配置,形式如“逗号隔开的多个语句id”。
其中,对SQL的分类一般有几个原则:
●将读语句和写语句分到不同的bucket。
●根据语句的应用场景,将在同一个事物中要执行的语句放到一个bucket。
●根据这个语句需要消耗的数据库资源,将消耗数据库资源多的语句放到独立的bucket里面,消耗数据库资源少的合并在一起。
在本发明中不使用Java reflect来完成O-R Mapping,以取得更好的性能。
上层调用者通过接口层来对本数据访问层调用,调用者可以获得Pooled Statement和Bucket两类进行数据库访问的实体对象,其中Bucket是包含多个Pooled Statement的实体,可进行跨语句的事务操作。数据访问层的核心管理语句池和数据连接池,完成和下层分布式环境下的多个数据库的连接。
参见图2所示,作为一个实施例具体的数据库调用过程包括如下步骤:
步骤201,在数据访问配置文件中配置好Bucket,每个Bucket中包括一类SQL和该Bucket的数据库连接。
步骤202,调用者通过borrowStatement()或borrowBucket()两类接口方法,根据“语句id”或“Bucket id”来获得Pooled Statement或Bucket。其中,如果需要进行非跨语句的事务操作,则获取PooledStatement,直接进入步骤204;如果需要进行跨语句的事务操作,应先获取Bucket。
步骤203,如果获得的是Bucket,则通过Bucket提供的getStatement()方法逐一获得其中的Pooled Statement。
步骤204,使用Pooled Statement提供的类似Java的JDBC中preparedStatment或callableStatment的各种接口方法进行数据操作。
步骤205,调用者通过returnMe()方法归还Pooled Statement或Bucket。
其中,步骤204中使用的Pooled Statement是对Java JDBC中preparedStatment的封装,因此,可以支持preparedStatment或callableStatment,后者对应一个数据库的存储过程。与JDBC的preparedStatment方法不同的是,对于需要返回数据集的数据访问,本方案定义了IResultSetHandler接口,该接口实现的功能是将使用SQL返回的数据库数据中的一行,组装成一个对象(Object),把这些对象放到一个列表(List)中返回给调用者。其中,所述SQL是所述步骤201生成的数据访问配置文件中配置好的。
作为一个实施例,数据访问配置文件采用Java Properties文件格式,优选方案包括如下要点:
SQL语句的配置形式为“语句id=SQL语句”,语句id是用于调用者访问语句,是从0开始的整数,如“0=select A,B from TableAwhere id=?”,可以为每个语句指定一些参数,如空闲时的保持时间等。可以用default.keep.alive来指定默认的保持时间,如default.keep.alive=30设置为30秒,keep.alive0=0表示0号语句永远保持,语句及连接池管理器不释放该语句及其所用数据库连接的资源,可用于实时性要求特别高的场合。
Bucket也通过id进行访问,用“逗号隔开的多个语句id”定义一个Bucket中包含的语句,可表示为class[bucket id].stmts=逗号隔开的多个语句id,如“class0.stmts=0,1,5”,定义了0号Bucket中包括了0,1,5号三个SQL语句。不同的Bucket使用不同的数据库连接,在一个应用中,不同的数据访问有不同的重要和优先级别,可以为每个Bucket指定最多可以用的数据库连接数来保障,可表示为class[bucketid].conn=最多可以用的数据库连接数,如class0.conn=3,指定该Bucket可以被实例化为3个Bucket实例,每个占用一个数据库连接。
数据库连接是否可写:可表示为class[bucketid].update=true/false,如class0.4update=true。其中Bucket中的语句要么全部是只读操作语句,要么全部都是包含写操作的语句,用Bucket的4update属性指定,默认为只读操作false。这样就把读与写在数据库连接上分离,以便对连接使用的优化。
参见图3所示,为按照上述优选方案生成的一个数据访问配置文件的例子。
本发明面向的是分布式的应用,在这些应用,数据访问通常以读为主。在高可用的分布式***中,关键数据一般会有多个拷贝,存在不同的数据库中。对于读操作,只需要任选其中一个数据库进行读操作。对于写,本发明为应用提供了灵活三种的策略供选择:
只写一个数据库:数据只写到一个数据库即完成,适合于不太重要的数据等情形。
多个数据同步写(简称同步写):数据要成功的写到多个数据库,事务才算成功。这种方式降低了该事务本身的可用性(因为要多个数据库写同时成功),但同时提高了数据的可靠性。
多个数据库异步写(简称异步写):先尝试把数据写到多个数据库中,如果成功,则事务成功完成;如果失败,则选择其中一个数据库写,并记录该数据需要同步到其他数据库中,由后台的同步机制进行事后的数据同步。
通过提供的三种写方式,使得不依赖数据库***即可实现高可用的数据存储,极大地降低了成本。
数据访问过程中,都需要进行复杂的异常处理,而在跨数据库的分布式***中,这些异常处理变得更加复杂。本方案对常见的异常处理进行很大程度的封装,当出现异常时,调用者不需要归还PooledStatement或Bucket,也不需要关心语句和连接的恢复等问题。本发明优选实施例中对数据进行特别的保护,当发生某些可以导致数据库崩溃的异常时,将对出错的数据库进行标记,拒绝再对其进行写操作。
在本发明的另一方面,还提供了一种数据库访问的实现***,参见图4所示,包括:
接口模块,用于提供数据库访问的接口,对于非跨语句的数据库访问,提供borrowStatement()接口方法获取Pooled Statement;对于跨语句的数据库访问,提供borrowBucket()接口方法获取Bucket;
Bucket模块,将同一类的SQL组成一个Bucket实例;提供getStatement()方法用于获得Pooled Statement模块的PooledStatement;
Pooled Statement模块,提供的接口方法进行数据库访问的数据操作;
连接及语句池管理模块,用于管理连接及SQL语句池。
分布式数据库存储器,用于存储数据库的数据。
其中,所述Bucket模块、Pooled Statement模块和连接及语句池管理模块可位于数据访问层。
作为一个优选实施例,所述连接及语句池管理模块,将定期(时间间隔可以配置)扫描池中的语句及数据库连接,释放不用的资源,对异常断开的数据库连接按一定的策略尝试重连。在数据访问配置文件中可以指定语句的空闲保持时间,超过这个时间语句没被使用,其资源将被回收,如果一个Bucket实例中的所有语句都被回收,则该Bucket实例连同其使用的数据连接都会被回收。应用可以为不同数据访问设定不同的保持策略,以获得最佳的性能。
连接及语句池管理模块通过一个二维数组(即Bucket池)来管理Bucket实例,第一维为Bucket实例所属的Bucket类型,第二维为该实例占用的数据库连接。调用者通过borrowStatement()或borrowBucket()方法申请语句或Bucket时,传入的参数为“Bucket id”或“语句id”,连接及SQL语句池管理模块操作过程一般如下:
如果参数为“语句id”,则通过一个索引转化为Bucket id。
根据Bucket id在Bucket池中找到属于该Bucket类型的所有Bucket实例,即一个一维数组。
扫描该数组,如果找到一个“空闲”的Bucket实例,标记为“在用”,如果调用者申请的是Bucket,则把该实例返回;如果申请的是语句,则根据“语句id”在该Bucket实例包含的语句中找到该语句返回。如果找不到“空闲”的Bucket实例,则过程休眠一段时间等待(时间长短可以配置),如果等待时间之后,还找不到“空闲”的实例,则抛出“忙”的异常。
参见图5所示,为基于上述***实施非跨语句访问过程的流程示意图,包括如下步骤:
步骤501,调用者调用borrowStatement()方法获得PooledStatement。
步骤502,使用Pooled Statement提供的类JDBCpreparedStatment或callableStatment的各种接口方法进行数据操作。
步骤503,使用Pooled Statement的returnMe()方法归还PooledStatement。
图6为基于上述***实施跨语句访问过程的流程示意图,包括如下步骤:
步骤601,调用者调用接口模块的borrowStatement()方法获得Pooled Statem ent。
步骤602,调用者调用接口模块的borrowBucket()方法获得Bucket。
步骤603,使用Bucket模块的getStatement()方法逐一获得其中的Pooled Statement。
步骤604,使用Pooled Statement模块提供的类JDBCpreparedStatment或callableStatment的各种接口方法进行数据操作。
步骤605,使用Bucket模块的returnMe()方法归还Bucket。
以下是本发明***在实际应用中的例子:
某省的******,数据分布在6个节点上,每个节点使用一对(两个)数据库(以下称互备数据库对),关键数据在这一对数据库中保持两个拷贝,一共12个数据库,分布在12台PC服务器主机上,***中的主机超过50台,是一个大型的分布式应用。
该******主要向用户提供本地生活服务信息,数据库中的数据主要包括商家信息(含其提供的产品和服务的信息)、用户信息等。使用本发明提供的方案进行数据库访问,有以下几种访问方式:
只读:在互备数据库对中都有拷贝的数据,只需要选择其中一个进行访问。
只写一个数据库:如一些访问日志,这些访问日志被定期汇总统计。
同步写:一些变化不大的关键数据采用同步写,如新增一个商家,修改商客的基本信息等。
异步写:一些经常变化的关键数据,如商家被访问的点击数,当一个数据发生故障之后中,服务需要继续以获得更高的可用性,发生故障的数据库修复后,由后台程序完成数据的同步。
该******正式上线以来,运行高效稳定,其中使用本发明的数据访问方案获得了很高的性能和可用性,而且因一个数据库的停机不影响***的主要服务,能很好的支持***的在线数据库升级。
该***部署在PC服务器集群上,使用开源的Linux操作***和开源MySQL数据库***,成本低廉,具有很高的性价比。
在该******的实际维护中,本发明集中配置SQL和数据库的优越性得到了很好的体现,所有的SQL和连接在一个配置文件中一目了然,可以方便的对数据访问进行配置和调优,在出现故障时,对***的调整可以做到更加心里有数;在多人参与的大型的软件开发中,在数据访问是容易出错的环节,本发明在编程模式上,不允许除数据访问配置文件之外在***中引入数据库访问,便于管理和控制。
所属领域的普通技术人员应当理解:以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (13)
1.一种数据库访问的实现方法,其特征在于,包括:
对SQL进行分类;
在数据访问配置文件中配置各Bucket,一个Bucket中包括同一类的SQL以及该Bucket的数据库连接;
如果进行非跨语句的数据库访问,则通过borrowStatement()接口方法获取Pooled Statement;如果进行跨语句的数据库访问,则通过borrowBucket()接口方法获取Bucket,通过Bucket提供的getStatement()方法逐一获得其中的Pooled Statement;
使用Pooled Statement提供的接口方法进行本次数据库访问的数据操作。
2.根据权利要求1所述的方法,其特征在于,如果进行非跨语句的数据库访问,则通过borrowStatement()接口方法,根据语句id来获取Pooled Statement;如果进行跨语句的数据库访问,则通过borrowBucket()接口方法,根据语句Bucket id来获取Bucket。
3.根据权利要求1所述的方法,其特征在于,通过一个二维数组来管理Bucket实例,第一维为Bucket实例所属的Bucket类型,第二维为该实例占用的数据库连接;
调用者通过borrowStatement()或borrowBucket()方法申请语句或Bucket时,传入的参数为“Bucket id”或“语句id”,池管理器操作过程如下:
如果参数为“语句id”,则通过一个索引转化为Bucket id。
根据Bucket id在Bucket池中找到属于该Bucket类型的所有Bucket实例,即一个一维数组;
扫描该数组,如果找到一个“空闲”的Bucket实例,标记为“在用”,如果调用者申请的是Bucket,则把该实例返回;如果申请的是语句,则根据“语句id”在该Bucket实例包含的语句中找到该语句返回;如果找不到“空闲”的Bucket实例,则过程休眠一段时间等待,如果等待时间之后,还找不到“空闲”的实例,则抛出表示“忙”的异常响应。
4.根据权利要求1所述的方法,其特征在于,通过returnMe()方法归还Pooled Statement或Bucket。
5.根据权利要求1所述的方法,其特征在于,该方法进一步包括:一次数据库访问所需的所有Bucket在一个数据访问配置文件中集中配置。
6.根据权利要求1所述的方法,其特征在于,所述数据访问配置文件采用Java的Properties文件,语句的配置形式为“语句id=SQL”,Bucket的配置形式如下:
包含的语句:class[bucket id].stmts=逗号隔开的多个语句id,定义了Bucket中包括的SQL语句;
最多可以用的数据库连接数:class[bucket id].conn=最多可以用的数据库连接数;
数据库连接是否可写:class[bucket id].update=true/false,默认为false,即只读。
7.根据权利要求1所述的方法,其特征在于,如果所述数据库访问为写操作,则采用如下三种方式之一执行:
只写一个数据库:数据只写到一个数据库即完成;
多个数据同步写:数据要成功的写到多个数据库,事务才算成功;
多个数据库异步写:先尝试把数据写到多个数据库中,如果成功,则事务成功完成;如果失败,则选择其中一个数据库写,并记录该数据需要同步到其他数据库中,由后台的同步机制进行事后的数据同步。
8.根据权利要求1所述的方法,其特征在于,当数据库访问过程中出现异常时,调用者不归还Pooled Statement或Bucket,将对出错的数据库进行标记,拒绝再对其进行写操作。
9.根据权利要求1所述的方法,其特征在于,在所述数据访问配置文件中指定语句的空闲保持时间,如果超出该空闲保持时间语句仍没有被使用,则回收该语句的资源;如果一个Bucket实例中的所有语句都被回收,则该Bucket实例连同其使用的数据连接都会被回收。
10.一种数据库访问的实现***,其特征在于,包括:
接口模块,用于提供数据库访问的接口,对于非跨语句的数据库访问,提供borrowStatement()接口方法获取Pooled Statement;对于跨语句的数据库访问,提供borrowBucket()接口方法获取Bucket;
Bucket模块,将同一类的SQL组成一个Bucket实例;提供getStatement()方法用于获得Pooled Statement模块的PooledStatement;
Pooled Statement模块,提供的接口方法进行数据库访问的数据操作;
连接及语句池管理模块,用于管理连接和SQL语句池;
分布式数据库存储器,用于存储数据库的数据。
11.根据权利要求10所述的***,其特征在于,所述接口模块,如果进行非跨语句的数据库访问,则通过borrowStatement()接口方法,根据语句id来获取Pooled Statement;如果进行跨语句的数据库访问,则通过borrowBucket()接口方法,根据语句Bucket id来获取Bucket。
12.根据权利要求10所述的***,其特征在于,所述Bucket模块,通过一个二维数组来管理Bucket实例,第一维为Bucket实例所属的Bucket类型,第二维为该实例占用的数据库连接;
调用者通过borrowStatement()或borrowBucket()方法申请语句或Bucket时,传入的参数为“Bucket id”或“语句id”,池管理器操作过程如下:
如果参数为“语句id”,则通过一个索引转化为Bucket id。
根据Bucket id在Bucket池中找到属于该Bucket类型的所有Bucket实例,即一个一维数组;
扫描该数组,如果找到一个“空闲”的Bucket实例,标记为“在用”,如果调用者申请的是Bucket,则把该实例返回;如果申请的是语句,则根据“语句id”在该Bucket实例包含的语句中找到该语句返回;如果找不到“空闲”的Bucket实例,则过程休眠一段时间等待,如果等待时间之后,还找不到“空闲”的实例,则抛出表示“忙”的异常响应。
13.根据权利要求10所述的***,其特征在于,所述接口模块,通过returnMe()方法归还Pooled Statement或Bucket。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010105365329A CN101980207B (zh) | 2010-11-09 | 2010-11-09 | 一种数据库访问的实现方法和*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010105365329A CN101980207B (zh) | 2010-11-09 | 2010-11-09 | 一种数据库访问的实现方法和*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101980207A true CN101980207A (zh) | 2011-02-23 |
CN101980207B CN101980207B (zh) | 2012-05-30 |
Family
ID=43600709
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010105365329A Active CN101980207B (zh) | 2010-11-09 | 2010-11-09 | 一种数据库访问的实现方法和*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101980207B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102945264A (zh) * | 2012-10-24 | 2013-02-27 | 浪潮集团山东通用软件有限公司 | 智能启用分布式事务的方法 |
CN102999392A (zh) * | 2012-11-23 | 2013-03-27 | 北京奇虎科技有限公司 | 分配数据库操作请求的方法和设备 |
CN102999575A (zh) * | 2012-11-12 | 2013-03-27 | 北京华通伟业科技发展有限公司 | 一种Hibernate映射配置文件的配置方法及*** |
CN103150344A (zh) * | 2013-02-06 | 2013-06-12 | 湖北微驾技术有限公司 | 基于对象关系映射框架的驾驶培训考试***数据访问方法 |
CN102955851B (zh) * | 2012-10-30 | 2016-05-11 | 北京奇虎科技有限公司 | 一种数据库的切换方法和装置 |
CN105653356A (zh) * | 2016-01-05 | 2016-06-08 | 世纪禾光科技发展(北京)有限公司 | 处理多服务器并发操作的方法及装置 |
CN106126540A (zh) * | 2016-06-15 | 2016-11-16 | 中国传媒大学 | 数据库访问***及其访问方法 |
WO2018120171A1 (zh) * | 2016-12-30 | 2018-07-05 | 华为技术有限公司 | 一种用于存储过程的执行方法、设备以及*** |
CN108255852A (zh) * | 2016-12-29 | 2018-07-06 | ***通信集团浙江有限公司 | Sql执行方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1869939A (zh) * | 2005-05-27 | 2006-11-29 | 华为技术有限公司 | 一种多线程应用程序访问数据库的方法 |
CN101395602A (zh) * | 2005-12-29 | 2009-03-25 | 亚马逊科技公司 | 用于分布式文件存储和索引服务的方法和装置 |
US20100030817A1 (en) * | 2008-07-31 | 2010-02-04 | Sybase, Inc | Statement categorization and normalization |
CN101840352A (zh) * | 2010-04-29 | 2010-09-22 | 中兴通讯股份有限公司 | 一种数据库连接池的监控方法及装置 |
-
2010
- 2010-11-09 CN CN2010105365329A patent/CN101980207B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1869939A (zh) * | 2005-05-27 | 2006-11-29 | 华为技术有限公司 | 一种多线程应用程序访问数据库的方法 |
CN101395602A (zh) * | 2005-12-29 | 2009-03-25 | 亚马逊科技公司 | 用于分布式文件存储和索引服务的方法和装置 |
US20100030817A1 (en) * | 2008-07-31 | 2010-02-04 | Sybase, Inc | Statement categorization and normalization |
CN101840352A (zh) * | 2010-04-29 | 2010-09-22 | 中兴通讯股份有限公司 | 一种数据库连接池的监控方法及装置 |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102945264B (zh) * | 2012-10-24 | 2017-02-15 | 浪潮通用软件有限公司 | 智能启用分布式事务的方法 |
CN102945264A (zh) * | 2012-10-24 | 2013-02-27 | 浪潮集团山东通用软件有限公司 | 智能启用分布式事务的方法 |
CN102955851B (zh) * | 2012-10-30 | 2016-05-11 | 北京奇虎科技有限公司 | 一种数据库的切换方法和装置 |
CN102999575A (zh) * | 2012-11-12 | 2013-03-27 | 北京华通伟业科技发展有限公司 | 一种Hibernate映射配置文件的配置方法及*** |
CN102999575B (zh) * | 2012-11-12 | 2015-10-14 | 北京华通伟业科技发展有限公司 | 一种Hibernate映射配置文件的配置方法及*** |
CN102999392B (zh) * | 2012-11-23 | 2016-12-21 | 北京奇虎科技有限公司 | 分配数据库操作请求的方法和设备 |
CN102999392A (zh) * | 2012-11-23 | 2013-03-27 | 北京奇虎科技有限公司 | 分配数据库操作请求的方法和设备 |
CN103150344A (zh) * | 2013-02-06 | 2013-06-12 | 湖北微驾技术有限公司 | 基于对象关系映射框架的驾驶培训考试***数据访问方法 |
CN105653356A (zh) * | 2016-01-05 | 2016-06-08 | 世纪禾光科技发展(北京)有限公司 | 处理多服务器并发操作的方法及装置 |
CN105653356B (zh) * | 2016-01-05 | 2018-12-11 | 数贸科技(北京)有限公司 | 处理多服务器并发操作的方法及装置 |
CN106126540A (zh) * | 2016-06-15 | 2016-11-16 | 中国传媒大学 | 数据库访问***及其访问方法 |
CN106126540B (zh) * | 2016-06-15 | 2019-07-09 | 中国传媒大学 | 数据库访问***及其访问方法 |
CN108255852A (zh) * | 2016-12-29 | 2018-07-06 | ***通信集团浙江有限公司 | Sql执行方法及装置 |
CN108255852B (zh) * | 2016-12-29 | 2020-09-11 | ***通信集团浙江有限公司 | Sql执行方法及装置 |
WO2018120171A1 (zh) * | 2016-12-30 | 2018-07-05 | 华为技术有限公司 | 一种用于存储过程的执行方法、设备以及*** |
US11182353B2 (en) | 2016-12-30 | 2021-11-23 | Huawei Technologies Co., Ltd. | Stored-procedure execution method and device, and system |
Also Published As
Publication number | Publication date |
---|---|
CN101980207B (zh) | 2012-05-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101980207B (zh) | 一种数据库访问的实现方法和*** | |
CN107679192B (zh) | 多集群协同数据处理方法、***、存储介质及设备 | |
Plattner et al. | Ganymed: Scalable replication for transactional web applications | |
CN109445802B (zh) | 基于容器的私有化Paas平台及其发布应用的方法 | |
US5721909A (en) | Distributed database architecture and distributed database management system for open network evolution | |
US20110154339A1 (en) | Incremental mapreduce-based distributed parallel processing system and method for processing stream data | |
US5835757A (en) | Distributed database management system for servicing application requests in a telecommunications switching system | |
US5764977A (en) | Distributed database architecture and distributed database management system for open network evolution | |
EP0675451A2 (en) | A distributed database architecture and distributed database management system for open network evolution | |
CN111061788A (zh) | 一种基于云架构的多源异构数据转换整合***及其实现方法 | |
CN101360123B (zh) | 一种网络***及其管理方法 | |
CN111400326A (zh) | 一种智慧城市数据管理***及其方法 | |
CN108804613A (zh) | 一种多源数据库实时融合***及其融合方法 | |
CN100538646C (zh) | 一种在分布式***中执行sql脚本文件的方法和装置 | |
CN102254021A (zh) | 基于虚拟机管理***的数据库构建方法 | |
CN108073696B (zh) | 基于分布式内存数据库的gis应用方法 | |
CN105069151A (zh) | HBase二级索引构建装置和方法 | |
CN109885642B (zh) | 面向全文检索的分级存储方法及装置 | |
CN107977446A (zh) | 一种基于数据分区的内存网格数据加载方法 | |
CN112269887A (zh) | 一种基于图数据库的分布式*** | |
CN109669975B (zh) | 一种工业大数据处理***及方法 | |
US5884311A (en) | Method and system for dynamically configuring a relational database | |
CN111126852A (zh) | 一种基于大数据建模的bi应用*** | |
Delaney et al. | Microsoft SQL Server 2012 Internals | |
CN113051263A (zh) | 基于元数据的大数据平台构建方法、***、设备及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
EE01 | Entry into force of recordation of patent licensing contract |
Application publication date: 20110223 Assignee: Tianyiyun Technology Co.,Ltd. Assignor: CHINA TELECOM Corp.,Ltd. Contract record no.: X2024110000020 Denomination of invention: An Implementation Method and System for Database Access Granted publication date: 20120530 License type: Common License Record date: 20240315 |
|
EE01 | Entry into force of recordation of patent licensing contract |