JAVA数据源连接方式汇总

转自http://blog.csdn.net/itwit/article/details/7028135

——————————————————————————————

一、问题引入

在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倍

时间: 2024-10-11 12:19:10

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

《java数据源—连接池》

<java数据源-连接池>1.数据源的分类:直接数据源.连接池数据源.2.连接池.数据源.JNDI a.数据源:Java中的数据源就是连接到数据库的一条路径,数据源中并无真正的数据,它仅仅记录的是你连接到哪个数据库,以及如何连接. b.连接池:简单的说就是保存所有的数据库连接的地方,在系统初始化时,将数据库连接对象存储到内存里,当用户需要访问数据库的时候,并不是建立一个新的连接,而是从连接池中 取出一个已经建立好的空闲连接对象.而连接池负责分配.管理.释放数据库连接对象.注意的是:连接池是由容

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

1.进入操作系统的管理工具 2.选择ODBC数据源[32位或64位] 3.列表中是当前数据库已有的数据源,右侧点击添加按钮,添加适合自己的数据源 4.在列表中选择索要连接数据库的ODBC驱动[这里我要连接MYSQL,所以要选择mysql odbc driver],双击驱动 如果在添加列表中没有mysql的odbc,可以下载并安装odbc驱动,网上很多,注意版本 5.在这里要配置连接所使用的mysql信息 6.以下是根据我本机的环境填写的信息 7.点击测试按钮之后,会弹出数据库连接成功或者失败 8

Java数据库连接——jdbc-odbc桥连接方式

jdbc-odbc桥连接方式操作数据库SU(Course) 步骤: 1.配置数据源 控制面板下搜索管理工具->ODBC数据源(32位)->添加->选择sql server(填写名称mytest,服务器local或者.)->下一步->更改默认的数据库为SU->下一步->测试数据源至成功 用户数据源会多一条mytest,至此配置数据源成功. 2.在程序中连接数据源 打开eclipse,编写程序. 1 public class Demo_1 { 2 3 public s

Java字符串连接的几种方式

Java字符串连接的几种方式 字符串表现的几种方式 StringBuffer和StringBuilder及String的继承关系 字符串的连接 1.String的连接方法 可以看出连接方式是新建了一个包含两个长度的字符数组,然后进行连接. 2.StringBuilder中存储字符串其实用的是一个char数组,capacity其实就是指定这个char数组的大小,StringBuilder的连接方法是继承AbstractStringBuilder的方法的,线程不安全的 在append(str)函数调

hibernate 查询方式汇总

主要摘自  http://blog.sina.com.cn/s/blog_7ffb8dd501014a6o.html ,http://blog.csdn.net/xingtianyiyun/article/details/7703429 Hibernate总的来说共有三种查询方式:HQL.QBC和SQL三种.但是细分可以有如下几种: 一.HQL查询方式     这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来

JDBC-ODBC桥连接方式操纵SQL数据库

/**  * 功能:演示使用JDBC-ODBC桥连接方式操纵SQL数据库  * 作者:徐守威  * 操作步骤:  * 1.配置数据源  * 2.在程序中连接数据源  * 3.操作数据  */ package com.jasxu; //引入sql包 import java.sql.*; public class T1 { /**   * @param args   */  public static void main(String[] args) {   // TODO Auto-generat

spring mvc 的jpa JpaRepository数据层 访问方式汇总

spring mvc 的jpa JpaRepository数据层 访问方式汇总 博客分类: spring jpa springjpaJpaRepository 本文转载至:http://perfy315.iteye.com/blog/1460226 AppleFramework在数据访问控制层采用了Spring Data作为这一层的解决方案,下面就对Spring Data相关知识作一个较为详细的描述. 1.Spring Data所解决的问题 Spring Data :提供了一整套数据访问层(DA

DB的连接方式练习

Today,测试java DB的连接方式. 目前就我所知了解的有两种: jdbc代码链接 dataSource 链接 下面来详细了解一下这两种连接方式 第一种 JDBC连接,对此我们需要了解一下JAVA的相关类 javax.sql类 软件包 javax.sql 为通过java 编程语言进行的服务器端数据源访问和处理提供API 接口摘要 CommonDataSource 此接口定义在DataSource .XADataSource 和 ConnectionPollDataSource 之间共用方法

hadoop 多数据源连接之DataJoin

一个MapReduce任务很可能访问和处理两个甚至多个数据集,在关系型数据库中,这将是两个或者多个表的连接,但是Hadoop系统没有关系型数据库中那样强大的连接处理功能,因此处理复杂一些.一般来讲,hadoop可以采用这几种数据连接方式: 1采用DataJoin类库实现Reduce端连接的方法 2 用全局文件复制实现Map端连接方法 3 带Map端过滤的Reduce端连接方法 Hadoop的Mapreduce框架提供了一种较为通用  的多数据源连接方法,该方法用DataJoin类库为程序员提供了