最近在研究JAVA的数据源连接方式,学习的时候发现了一位同行写的文章,转载过来,留作记录!

一、问题引入

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

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

java.sql提供了一些接口和类,用于支持数据库增删改查等相关的操作。该jar包定义了java访问各种不同数据库(mysql,oracle,sqlserver。。。。。)的统一接口和标准。同时,各个数据库厂商都提供了该jar包中定义的各个接口的实现类,用于具体实现本厂数据库的增删改查操作,即称之为“数据库驱动jdbc driver”。例如mysql的数据库驱动为:com.mysql.jdbc.driver;oracle的数据库驱动为: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框架依赖的第三方使用了c3p0和dbcp两种方式;而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.jar,commons-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)、修改tomcat的conf下的context.xml文件,增加Resource的配置的支持。

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

(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)、详情参考jndisql。Java文件,以及index.jsp。

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

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

3、 使用C3p0方式

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

同时,关于数据库连接的具体参数,例如:url,username,password,最小连接数,最大连接数。。。。。等信息既可以在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是快速高效的数据库连接池组件,据说性能上目前是最好得,比C3P0和DBCP快25倍。使用该组件,需要导入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 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继 承而来,而且都有最大连接数,初始化连接数等概念。同时,他们又分别有各自不同的属性,做了扩展。这里只是简单的介绍,在实际使用中,想要实现高性能的数 据库连接池管理,还需要深入研究每种方式的连接属性配置;例如:根据实际需要,设置合适的最小连接数和最大连接数,等待时间等。

 

五、Java(x).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一起发布,包括了实现jdbc3和jdbc2扩展规范说明的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,Resin3与JBoss3.它同样也有一个独立的版本可以在应用程序中使用而不必运行在容器中。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倍。

JAVA数据源连接方式汇总的更多相关文章

  1. PowerDesigner连接Oracle数据库生成数据模型【数据源连接方式】

    1.进入操作系统的管理工具 2.选择ODBC数据源[32位或64位] 3.列表中是当前数据库已有的数据源,右侧点击添加按钮,添加适合自己的数据源 4.在列表中选择索要连接数据库的ODBC驱动[这里我要 ...

  2. 【Kettle】3、数据源连接配置

    1.各系统版本信息 System:Windows旗舰版 Service Pack1 Kettle版本:6.1.0.1-196 JDK版本:1.8.0_72 2.连接介绍 关于Kettle数据源连接方式 ...

  3. Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】

    []如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...

  4. reportConfig.xml两种数据源连接的配置方式

     在reportConfig.xml配置文件中,我们提供了两种数据源连接的配置方式,分别如下: 1.jndi数据源配置(即:在dataSource中配置) 此配置适用于在j2ee的服务器中配置了j ...

  5. java oracle thin 和 oci 连接方式实现多数据库的故障切换

    java oracle thin 和 oci 连接方式实现多数据库的故障切换 一.thin方式 该种方式简便易用非经常见. 当中URL为 jdbc:oracle:thin:@(DESCRIPTION= ...

  6. ORACLE 分页 java 用jdbc方式以 sys账号连接oracle数据的问题

    2,3,4,6,8   betwenen 为闭区间,前后都包括 select * from(select a.*,rownum rn from (select * from student) a ) ...

  7. Java连接Oracle数据库的三种连接方式

    背景: 这两天在学习Oracle数据库,这里就总结下自己上课所学的知识,同时记录下来,方便整理当天所学下的知识,也同时方便日后自己查询. SQL语句的话,这里我就不多讲了,感觉和其他的数据库(MySQ ...

  8. Java数据库连接——jdbc-odbc桥连接方式及汉字乱码问题

    jdbc-odbc桥连接方式操作数据库SU(Course),其中Course属性有Cno,Cname,Cpno,Ccredit. 步骤: 1.配置数据源 控制面板下搜索管理工具->ODBC数据源 ...

  9. 浅析jdbc建立连接方式与背后的java类加载

    关于jdbc的连接方式#1Connection conn;Class.forName("com.mysql.jdbc.Driver"); //2conn=DriverManager ...

随机推荐

  1. socket.io问题,io.sockets.manager.rooms和io.sockets.clients('particular room')这两个函数怎么用?

    为什么我用nodejs用这个两个函数获取都会出错呢?是不是socket的api改了?请问现在获取房间数和当前房间的客户怎么获取?什么函数?谢谢!!急求!     网友采纳 版本问题.io.socket ...

  2. 7款超酷HTML5 3D动画精选应用及源码

    对以前来讲,3D动画拿到网页上展示是一件非常奢侈的事情,第一是浏览器不够先进,第二是大部分只能用flash实现伪3D.HTML5的出现,让实现网页3D动画变得非常简单,当然前提是你不要再使用像IE67 ...

  3. JS函数式编程【译】2.2 与函数共舞

  4. HDU1022 Train Problem I 栈的模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 栈的模拟,题目大意是已知元素次序, 判断出栈次序是否合理. 需要考虑到各种情况, 分类处理. 常 ...

  5. 《shell脚本if..then..elif..then.if语句的总结》

    第一种: #!/bin/bash service vsftpd start &> /dev/null if [ $? -eq 0 ] then echo "ftp is sta ...

  6. document.write() 和 document.writeln() 区别

    写javascript页面时,看到这两个函数,第一感觉应该是一个换行,一个不换行, 但是实际使用时是一样的(writeln()函数在浏览器页面会多一个空格而不是换行). 简单搜索查阅了下: 查看源 d ...

  7. C# winform 中 TabControl 动态显示 TabPage

    在winform应用中,tabcontrol是一个很好的控件,可以根据需求提供多个选项卡(TabPages),但是有一个问题是当某个项目需要多个选项卡,但是不同的功能要求显示不同的选项卡,其他的非该功 ...

  8. AngularJS(17)-Angular小程序

    现在可以开始创建您的第一个 AngularJS 应用程序,一个 AngularJS 单页 Web 应用. <!DOCTYPE html> <html lang="en&qu ...

  9. [react native] Error loading page

    如上图显示的错误,解决方法如下: 在react native ios项目的info.plist文件中,新增一个属性. 在Info.plist中添加NSAppTransportSecurity类型Dic ...

  10. How to change comment

    AX2009 // USR Changed on 2013-07-10 at 12:57:46 by 7519 - Begin // USR Changed on 2013-07-10 at 12:5 ...