`
jguangyou
  • 浏览: 368980 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA数据源连接方式汇总

 
阅读更多

一、问题引入

java程序中,需要访问数据库,做增删改查等相关操作。如何访问数据库,做数据库的相关操作呢?

 

二、Java连接数据库方法概述

java.sql提供了一些接口和类,用于支持数据库增删改查等相关的操作。该jar包定义了java访问各种不同数据库(mysqloraclesqlserver。。。。。)的统一接口和标准。同时,各个数据库厂商都提供了该jar包中定义的各个接口的实现类,用于具体实现本厂数据库的增删改查操作,即称之为数据库驱动jdbc driver”。例如mysql的数据库驱动为:com.mysql.jdbc.driveroracle的数据库驱动为:oracle.jdbc.driver.oracledriver

java程序中访问数据库,做数据库连接时,可以采用两种方式:

1、使用java.sql API

利用该包提供的各种接口和类直接访问数据库。

 

2、使用数据库连接池

目前存在多个开源的java数据库连接池,这些连接池都是在java.sql基础上编写而成。

Ø  该连接池的解决的问题是

当使用java.sql中提供的api创建数据库连接时候,需要耗费很大的资源,要进行用户名密码数据库连接验证等,即耗费资源也耗费时间。如果在程序中,每次需要访问数据库时候,都进行数据库连接,那么势必会造成性能低下;同时,如果用户失误忘记释放数据库连接,会导致资源的浪费等。而数据库连接池就是解决该问题,通过管理连接池中的多个连接对象(connection),实现connection重复利用。从而,大大提高了数据库连接方面的性能。

Ø  该连接池的功能是:

负责创建,管理,释放,分配数据库连接即(connection)。首先,负责创建相应数目的数据库连接对象(connection)对象,并存放到数据库连接池(connect pool)中。当用户请求数据库连接时,该连接池负责分配某个处于空闲状态的数据库连接对象;当用户发出释放该数据库连接时,该连接池负责将该连接对象重新设置为空闲状态,以便被别的请求重复利用。同时;数据库连接池负责检查(空闲时间>最大空闲时间)的数据库连接,并释放。

Ø  连接池主要参数介绍

最小连接数:初始化时,系统将负责创建该数目的connection放入连接池中。

最大连接数:系统允许创建connection的最大数值。当系统请求连接时候,且连接池中不存在空闲的连接:如果connection总数未超过最大连接数,那么连接池负责创建新的connection对象,并返回该对象;如果connection总数已经到达该最大连接数,那么连接池将用户请求转入等待队列。

 

 

三、常用的数据库连接池

1、 JNDI

2、 C3p0

3、 Apache Jakarta DBCP

4、 BoneCP

其中,sping框架依赖的第三方使用了c3p0dbcp两种方式;而bonecp号称是速度最快的数据库连接池。JNDI方式创建实现的datasource是真正实现了javax.sql.datasource;其他的三种方式都不是。下面的列表,列出了几种方式的区别和不同:

序号

连接池名称

依赖的jar

实现的datasource

备注

1

JNDI

该数据源是由相应的web服务器(例如:tomcat,weblogic,websphere)负责初始化,创建,管理。程序中不需要引入特别的jar包。

Javax.sql.datasource

 

2

C3P0

c3p0-0.9.xxx.jar

com.mchange.v2.c3p0.ComboPooledDataSource

 

3

DBCP

commons-dbcp.jarcommons-pool.jar

org.apache.commons.dbcp.BasicDataSource

 

4

BoneCP

 

bonecp-0.6.5.jar

· google-collections-1.0.jar

· slf4j-api-1.5.11.jar

· slf4j-log4j12-1.5.11.jar

·log4j-1.2.15.jar

 

BoneCPDataSource

 

备注:以上几种方式的数据库连接池的配置参数大同小异,略有差别;其参数的配置,既可以通过配置文件的方式配置,也可以通过硬编码的方式配置。

 

四、分别列出几种连接池的编码例子

(所有的例子均可以参考D:\work\qsyworkspace2\jdbctest项目)

1、 使用java.sql API直接访问数据库

详细请参考javasql.java文件。

       

Class.forName("com.mysql.jdbc.Driver");

           String url="jdbc:mysql://localhost:3306/editortest";

           String user="root";

           String password="123456";

           Connection cn=DriverManager.getConnection(url, user, password);

           Statement st=cn.createStatement();

           String sql="select * from artical where id=1";

           ResultSet rs=st.executeQuery(sql);

           while(rs.next()){

              System.out.println("1:"+rs.getString(1));

              System.out.println("2:"+rs.getString(2));

              System.out.println("3:"+rs.getString(3));

              System.out.println("4:"+rs.getString(4));    

        }

2、 使用JNDI方式

这种方式,是由web服务器,实现了java.sql.datasource。由web服务器负责初始化数据源,创建connection,分配,管理connection。由于本身是由web服务器实现的功能,因此不需要在项目project中引入特别的jar包,但是需要在服务器的某些配置文件中增加相关的配置。下面,以tomcat服务器为例,讲述这种方式的使用。

    1)、修改tomcatconf下的context.xml文件,增加Resource的配置的支持。

    2)、由于数据源是由tomcat负责创建,所以需要的jdbc驱动应该放到tomcatlib路径下。

    3)、编写使用java代码,并放在tomcat环境下使用,如下:

public void jnditest(){

       // TODO Auto-generated method stub

       try {

           Context initcontext=new InitialContext();

           Context context=(Context) initcontext.lookup("java:comp/env");

          

 

           DataSource datasource=(DataSource)context.lookup("jdbc/editortest");

          

           Connection cn=datasource.getConnection();

          

           Statement st=cn.createStatement();

           String sql="select * from artical where id=1";

           ResultSet rs=st.executeQuery(sql);

           while(rs.next()){

              System.out.println("1:"+rs.getString(1));

              System.out.println("2:"+rs.getString(2));

              System.out.println("3:"+rs.getString(3));

              System.out.println("4:"+rs.getString(4));    

           }

       } catch (NamingException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

 

        4)、详情参考jndisqlJava文件,以及index.jsp

 

注意:该测试不能在main方法中测试;可以写一个jsptomcat环境中测试。因为:java单元的环境是jdk;而jsp的环境却是tomcat;数据连接池是在tomcat中配置的,所以能正常运行的,但java测试的环境只有jdk,所以在引用数据连接池时就时出现找不到环境的错误。

使用环境:当使用weblogic或者websphere等高级的web服务器的时候,可以考虑使用这种方式提高性能。

3、 使用C3p0方式

C3P0是开源的数据库连接组件,支持创建数据库连接池,管理connection等功能。使用该种方式做数据库连接时候,需要导入c3p0-0.9.1.2.jar

同时,关于数据库连接的具体参数,例如:urlusernamepassword,最小连接数,最大连接数。。。。。等信息既可以在xml配置文件中配置,也可以通过程序编码方式创建。Spring支持c3p0的数据库连接池方式,因此在spring环境中使用时,支持在applicationcontext.xml文件中配置。另外,由于数据库连接池在整个project中针对某个数据库而言是单例的,所以,即使通过编码的方式创建,那么要保证其单实例特性。如果存在多个,那么必然会导致性能低下。

下面,列出通过程序编码方式使用c3p0数据库连接池的方式。

ComboPooledDataSource ds = new ComboPooledDataSource();

       try {

           ds.setDriverClass("com.mysql.jdbc.Driver");

           ds.setJdbcUrl("jdbc:mysql://localhost:3306/editortest");

           ds.setUser("root");

           ds.setPassword("123456");

           ds.setMaxPoolSize(20);

           ds.setInitialPoolSize(10);

           ds.setMaxIdleTime(2000);

           Connection cn=ds.getConnection();

           Statement st=cn.createStatement();

           String sql="select * from artical where id=1";

           ResultSet rs=st.executeQuery(sql);

           while(rs.next()){

              System.out.println("1:"+rs.getString(1));

               System.out.println("2:"+rs.getString(2));

              System.out.println("3:"+rs.getString(3));

              System.out.println("4:"+rs.getString(4));    

           }

          

       } catch (PropertyVetoException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

    }

    备注:通常使用方式,都是通过配置文件配置,几乎不会用到这种硬编码方式。在此,只是简单介绍C3P0的使用方式。详情,可以参考c3p0test.java

 

4、 使用dbcp方式

DBCP方式,是apache提供的数据源连接池方式,支持数据库连接池创建,管理connection等功能。使用环境,需要导入commons-dbcp.jar  commons-pool.jar两个jar包。上面提到的JNDI方式,其实质实用的就是dbcp数据源;只是他是通过在web服务器上做配置,由web服务器负责创建该数据源。

同样的,dbcp数据源也支持xml配置文件和硬编码两种方式。通常使用方式,都是通过配置文件配置,几乎不会使用硬编码方式。下面简单介绍dbcp方式的编码:

BasicDataSource ds = new BasicDataSource();

       ds.setDriverClassName("com.mysql.jdbc.Driver");

       ds.setUrl("jdbc:mysql://localhost:3306/editortest");

       ds.setUsername("root");

       ds.setPassword("123456");

       ds.setMaxIdle(20);

       ds.setInitialSize(10);

       ds.setMaxActive(2000);

       try {

           Connection cn=ds.getConnection();

           Statement st=cn.createStatement();

           String sql="select * from artical where id=1";

           ResultSet rs=st.executeQuery(sql);

           while(rs.next()){

              System.out.println("1:"+rs.getString(1));

              System.out.println("2:"+rs.getString(2));

              System.out.println("3:"+rs.getString(3));

              System.out.println("4:"+rs.getString(4));    

           }

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

    }

5、 使用BoneCP方式。

BoneCP是快速高效的数据库连接池组件,据说性能上目前是最好得,比C3P0DBCP25倍。使用该组件,需要导入bonecp-0.6.5.jargoogle-collections-1.0.jarslf4j-api-1.5.11.jarslf4j-log4j12-1.5.11.jarlog4j-1.2.15.jar

下面,简单列出编码方式的使用,做简单的了解。

BoneCPDataSource ds = new BoneCPDataSource();

       ds.setDriverClass("com.mysql.jdbc.Driver");

       ds.setJdbcUrl("jdbc:mysql://localhost:3306/editortest");

       ds.setUsername("root");

       ds.setPassword("123456");

      

       try {

           Connection cn = ds.getConnection();

           Statement st = cn.createStatement();

           String sql = "select * from artical where id=1";

           ResultSet rs = st.executeQuery(sql);

           while (rs.next()) {

              System.out.println("1:" + rs.getString(1));

              System.out.println("2:" + rs.getString(2));

               System.out.println("3:" + rs.getString(3));

              System.out.println("4:" + rs.getString(4));

           }

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

    }

 

总结:以上,介绍了几种常用的数据源连接池;这几种连接池在使用过程,即支持硬编码的方式,也支持配置文件的配置方式;在正式实用的时候,应该尽量使用配置的方式,便于维护和管理。硬编码的方式,可以做为测试使用。同时,spring框架,通过他自己的方式集成上述几种数据源,理论上来说,都支持。各个数据源连接池都有一些公有的属性,因为他们都是从javax.sql.datasource继承而来,而且都有最大连接数,初始化连接数等概念。同时,他们又分别有各自不同的属性,做了扩展。这里只是简单的介绍,在实际使用中,想要实现高性能的数据库连接池管理,还需要深入研究每种方式的连接属性配置;例如:根据实际需要,设置合适的最小连接数和最大连接数,等待时间等。

 

五、Javax.sql直接操作数据库与各个开源数据源(datasource)关系

当使用JDK提供的java(x).sql包中的类访问数据库时候,基本上用到的就是drivermanager,connection,statement,resultset。其中drivermanger是类,他调用相应的驱动(即各个数据库厂商提供的驱动)中的方法生成connection对象。Connection是接口,在各个数据库厂商提供的数据库驱动中,都实现了该接口。例如:当使用com.mysql.jdbc.driver时候,生成的connection即为com.mysql.jdbc.Connection对象。

Javax.sql包中定义了接口datasource,统一规定了作为数据源连接池必须提供的方法和属性等。各个数据源组件中提供的datasource都实现了该接口。当通过数据源连接池的方式获取connnection的时候,同样的,各个数据源组件也都提供(实现了java.sql.connection)接口的类。

更为具体的细节,可以参考jdk文档中关于java(x).sql包中相关类和接口的描述;参考开源数据源连接池组件的相关源码(例如C3P0);参考相关的数据库驱动。

 

六、附录:Java开源的数据库连接池

        Java中开源的数据库连接池有以下几种 :

  1, C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3jdbc2扩展规范说明的Connection Statement 池的DataSources 对象。

  2,Proxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。

  3,Jakarta DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。

  4,DDConnectionBroker DDConnectionBroker是一个简单,轻量级的数据库连接池。

  5,DBPool DBPool是一个高效的易配置的数据库连接池。它除了支持连接池应有的功能之外,还包括了一个对象池使你能够开发一个满足自已需求的数据库连接池。

  6,XAPool XAPool是一个XA数据库连接池。它实现了javax.sql.XADataSource并提供了连接池工具。

  7,Primrose Primrose是一个Java开发的数据库连接池。当前支持的容器包括Tomcat4&5,Resin3JBoss3.它同样也有一个独立的版本可以在应用程序中使用而不必运行在容器中。Primrose通过一个web接口来控制SQL处理的追踪,配置,动态池管理。在重负荷的情况下可进行连接请求队列处理。

  8,SmartPool SmartPool是一个连接池组件,它模仿应用服务器对象池的特性。SmartPool能够解决一些临界问题如连接泄漏(connection leaks),连接阻塞,打开的JDBC对象如Statements,PreparedStatements. SmartPool的特性包括支持多个pools,自动关闭相关联的JDBC对象, 在所设定time-outs之后察觉连接泄漏,追踪连接使用情况, 强制启用最近最少用到的连接,SmartPool"包装"成现存的一个pool等。

  9,MiniConnectionPoolManager MiniConnectionPoolManager是一个轻量级JDBC数据库连接池。它只需要Java1.5(或更高)并且没有依赖第三方包。

10,BoneCP BoneCP是一个快速,开源的数据库连接池。帮你管理数据连接让你的应用程序能更快速地访问数据库。比C3P0/DBCP连接池快25倍。

分享到:
评论

相关推荐

    MongoDB Java操作大全 源代码 实例

    MongoDB Java操作大全 源代码 实例

    Java教务管理系统源码 springboot教务系统源码

    校区管理 班级管理 学生管理 满意度管理 数据汇总 知识管理 总部督查 系统监控 系统工具 系统管理 后台:SpringBoot2.x + MyBatis3.x + Shiro1.4 + Thymeleaf3.0 前台:html.jquery.Ajax.Bootstrap.layer 核心框架...

    Java数据库编程宝典3

    1.5.1 Java数据对象 1.5.2 两层模型 1.5.3 三层模型 1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    《Java Web编程宝典(十年典藏版)》附有配套DVD光盘,光盘中提供了书中全部实例和项目的源代码。这些源代码全部经过精心调试,能够在Windows XP、WindowsServer2003及Windows7操作系统下编译和运行。 《Java Web...

    Java数据库编程宝典2

    1.5.1 Java数据对象 1.5.2 两层模型 1.5.3 三层模型 1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2...

    Java数据库编程宝典4

    1.5.1 Java数据对象 1.5.2 两层模型 1.5.3 三层模型 1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2...

    Java数据库编程宝典1

    1.5.1 Java数据对象 1.5.2 两层模型 1.5.3 三层模型 1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2...

    springboot-demos:SpringBoot 学习案例汇总。包括:日志AOP、redis、数据库、多数据源、mybatisplus、jar包war包、定时任务、swagger等,持续学习更新

    SpringBoot 学习案例汇总。 springboot-log4j2 包含:log4j2、lombok、日志切面、方法日志注解、常见日志Utils等 建议 IDEA 配置日志插件 Grep Console 一起使用 springboot-rediscluster 包含:redis集群模式配置、...

    数据分析与挖掘实验报告.doc

    知识发现过程如下: ·数据清理(消除噪声和删除不一致的数据) ·数据集成(多种数据源可以组合在一起) ·数据转换(从数据库中提取和分析任务相关的数据) ·数据变换(从汇总或聚集操作,把数据变换和统一成适合...

    大数据分析报告与挖掘实验报告材料.doc

    知识发现过程如下: ·数据清理(消除噪声和删除不一致的数据) ·数据集成(多种数据源可以组合在一起) ·数据转换(从数据库中提取和分析任务相关的数据) ·数据变换(从汇总或聚集操作,把数据变换和统一成适合...

    数据分析与挖掘实验报告(2).doc

    知识发现过程如下: ·数据清理(消除噪声和删除不一致的数据) ·数据集成(多种数据源可以组合在一起) ·数据转换(从数据库中提取和分析任务相关的数据) ·数据变换(从汇总或聚集操作,把数据变换和统一成适合...

    数据分析与挖掘实验报告(1).doc

    知识发现过程如下: ·数据清理(消除噪声和删除不一致的数据) ·数据集成(多种数据源可以组合在一起) ·数据转换(从数据库中提取和分析任务相关的数据) ·数据变换(从汇总或聚集操作,把数据变换和统一成适合...

    大数据应用测试经验总结.pdf

    数据采集:采集使⽤java和python程序从⽂件服务器下载⽂件,并把⽂件写⼊kafka、Hbase和Hive、Mysql中; 2. 计算引擎:使⽤Hive on Tez计算引擎实现ETL跑批任务;使⽤spark streaming实现实时计算;使⽤Phoenix做...

    百度地图开发java源码-ldmgr:个人学习资料管理系统,学习资料入库管理,学习计划管理,任务进度管理

    百度地图开发java源码 ...(1)、资料展示:传统展现方式,将所有资料以表格方式汇总 (2)、资料管理:包括资料入库、资料作废(没有删除功能,作废后不做详细展示,需标出作废原因)、 资料源与物理路径关联(可以

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    该资料是《Oracle SQL高级编程》的源代码 对应的书籍资料见: Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐) 基本信息 原书名: Pro Oracle SQL 原出版社: Apress 作者: (美)Karen Morton Kerry ...

    asp.net知识库

    ASP.NET 2.0 中的数据源控件 使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 Ibatisnet 提供的CacheModel ASP.NET 2.0中小心Profile命名冲突 使用ASP.NET 2.0 ...

    单点登录源码

    - 一站式支付解决方案,统一下单接口,支持支付宝、微信、网银等多种支付方式。不涉及业务的纯粹的支付平台。 - 统一下单(统一下单接口、统一扫码)、订单管理、数据分析、财务报表、商户管理、渠道管理、对账系统...

Global site tag (gtag.js) - Google Analytics