zoukankan      html  css  js  c++  java
  • Java使用独立数据库连接池(DBCP为例)

    目前,绝大多数的软件系统都会使用数据库,而在软件构建起来之后,访问数据库又成为软件系统性能的短板(I/O操作)。一般来说一次访问数据库就需要一个数据库连接。而每次创建数据库连接都需要访问,分配空闲资源,占用资源,释放资源,结束访问。非常的耗费时间和空间。 

    于是数据连接池技术便产生了,其原理就是在数据请求方和数据库之间建立一个数据库连接管理层。在系统启动的时候就分配一定数量的连接,并维护这些连接,保持最低数量的连接数。同时为了保护数据库和系统,设置一个最大连接数,缓解数据库的访问压力。 

    这样在每次数据请求方需要连接时,管理器便分配一个连接给数据请求方,数据请求方使用完连接后,将连接归还给管理器,这样就尽可能的减少不必要的数据库连接消耗。 

    在Java的数据库服务JDBC中并没有提供一个实际ConnectionPool实现,但是留出了接口以支持第三方服务提供商,我觉得其中最重要的接口是DataSource。 

    实际上Java访问数据库的方式主要有四种: 
    一、使用DriverMananger来直接编程实现,这种是最基本的方式。 
    DriverMananger实现数据库连接的关键步骤为: 
    1>Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance(); 
    2>Connection conn = null; 
    3>conn = DriverManager.getConnection(url, "name", "password"); 

    二、使用服务器配置文件来实现连接池。 
    一些服务器提供了自己的数据库连接池服务,例如Tomcat服务器就提供了由commons-DBCP支持的数据池连接服务,只需要在context.xml中填写相应的数值就可以了。 

    三、配置文件配置 datasource 
    DataSource是在JavaAPI中提供的一个接口,第三方服务在实现了DataSource之后,例如DBCP的BasicDataSource,为了提高数据库连接池的可配置性,便利用IOC模式(控制反转),将实际的Bean与配置数据分开,配置数据放在配置文件中(一般使用XML)。来实现对多个数据库的控制。 

    而在DataSource对象实例化之后,通过DataSource.getConnection()就可以得到连接了。 

    四、通过配置jdbc-odbc连接桥 
    听说过,没有使用过,没有发言权。 

    在这里使用Apache提供的commons-DBCP来实现一个独立的简单的数据库连接池。 

    首先需要三个工具包:commons-pool.jar,commons-collection.jar,commons-DBCP.jar。 

    关键实现代码段见下: 
    Java代码  收藏代码
    1. //持有一个静态的数据库连接池对象  
    2. private static DataSource DS;  
    3.   
    4.   
    5. //使用DBCP提供的BasicDataSource实现DataSource接口  
    6. public static void initDataSource(String connectURI, String username,  
    7.             String password, String driverClass, int initialSize,  
    8.             int maxActive, int maxIdle, int maxWait) {  
    9.                   BasicDataSource ds = new BasicDataSource();  
    10.         ds.setDriverClassName(driverClass);  
    11.         ds.setUsername(username);  
    12.         ds.setPassword(password);  
    13.         ds.setUrl(connectURI);  
    14.         ds.setInitialSize(initialSize);  
    15.         ds.setMaxActive(maxActive);  
    16.         ds.setMaxIdle(maxIdle);  
    17.         ds.setMaxWait(maxWait);  
    18.         DS = ds;  
    19.     }  
    20. //获得一个数据库连接  
    21. public Connection getConnection() {  
    22.   
    23.         Connection con = null;  
    24.         if (DS != null) {  
    25.             try {  
    26.                 con = DS.getConnection();  
    27.             } catch (Exception e) {  
    28.                 System.out.println(e.getMessage());         }  
    29.                            //将数据库连接的事物设置为不默认为自动Commit  
    30.             try {  
    31.                 con.setAutoCommit(false);  
    32.             } catch (SQLException e) {  
    33.                 System.out.println(e.getMessage());         }  
    34.             return con;  
    35.         }  
    36.                   //回收数据库连接时,直接使用con.close()即可  
    37.         return con;  
    38.   
    39.     }  
    40.   
    41. //回收数据库连接  
    42.     protected static void shutdownDataSource() throws SQLException {  
    43.         BasicDataSource bds = (BasicDataSource) DS;  
    44.         bds.close();  
    45.     }  


    上面的代码都是从实际使用的代码抽取出来的,希望可以帮助大家。 

    目前,OpenSource中提供了很多的数据库连接池技术,使用的流程和模式,都与上面的代码大同小异。同时最新发布的BoneCP我还从来没有感受过,希望有朋友与我分享一下使用经验。 

  • 相关阅读:
    一例千万级pv高性能高并发网站架构[原创]
    Download SymmetricDS Data Sync Software for Free
    阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
    青云QingCloud业内率先支持云端全面透明代理功能 | SDNLAB | 专注网络创新技术
    UCloud EIP 你真的懂得如何使用么?
    MySQL高可用性大杀器之MHA | 火丁笔记
    Zookeeper、Solr和Tomcat安装配置实践
    Best Premium Private Proxy Service | Lime Proxies
    突破LVS瓶颈,LVS Cluster部署(OSPF + LVS)
    Nodejs负载均衡:haproxy,slb以及node-slb
  • 原文地址:https://www.cnblogs.com/zhwl/p/4774820.html
Copyright © 2011-2022 走看看