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

java数据库连接方法汇总《转》

 
阅读更多

2011-06-09 11:52:19| 分类: 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 是快速高效的数据库连接池组件,据说性能上目前是最好得,比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数据库连接

    java数据库连接汇总

    Java数据库连接——JDBC

    Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法 模型 JDBC API 既支持数据库访问的两层模型(C...

    jdbc(java的数据库连接方式总汇)

    对于那些对数据库连接方式不熟悉的初学者有一定帮助的~

    Java数据库编程宝典3

    3.7 将查询结果进行汇总 3.7.1 集合函数 3.7.2 使用HAVING子句来筛选组 3.7.3 使用索引提高SQL查询效率 3.7.4 格式化SQL命令 3.7.5 使用SQL连接 3.7.6 编写SQL的JOIN命令 3.7.7 使用UNION运算符进行组合查询...

    Java连接各个版本Oracle/Mysql/DB2…数据库代码

    Java连接各个版本Oracle/Mysql/DB2…数据库代码汇总的工具类(附源码和jar包)

    java数据库驱动大全

    目前广泛应用 的数据库驱动连接包汇总 目前广泛应用 的数据库驱动连接包汇总 目前广泛应用 的数据库驱动连接包汇总

    JAVA连接数据库 JDBC驱动汇总

    Db Name: Microsoft SQL Server (6.5, 7, 2000 and 2005) and Sybase (10, 11, 12). Db Name: Microsoft SQL Server 2000 Db Name: Oracle Db Name: MySQL Db Name: IBM Informix Db Name: Postgresql ...

    基于JAVA数据库实现酒店管理系统

    主要是酒店管理系统的需求包括开台点菜功能、智能化获取菜品功能、自动结账功能、营业额报表功能等。...按日消费额汇总统计实现的月结账功能。 按日营业额实现的年结账功能。 系统运行稳定、安全可靠。

    java jdbc连接数据库【Mysql sqlsever orcl sqlite】汇总

    整合了java语言通过jdbc连接Mysql sqlsever orcl sqlite 四种数据库的连接类,分页等功能,方便与初学者直接下载,直接使用。

    Java数据库编程宝典2

    3.7 将查询结果进行汇总 3.7.1 集合函数 3.7.2 使用HAVING子句来筛选组 3.7.3 使用索引提高SQL查询效率 3.7.4 格式化SQL命令 3.7.5 使用SQL连接 3.7.6 编写SQL的JOIN命令 3.7.7 使用UNION运算符进行组合查询...

    Java数据库编程宝典1

    3.7 将查询结果进行汇总 3.7.1 集合函数 3.7.2 使用HAVING子句来筛选组 3.7.3 使用索引提高SQL查询效率 3.7.4 格式化SQL命令 3.7.5 使用SQL连接 3.7.6 编写SQL的JOIN命令 3.7.7 使用UNION运算符进行组合查询...

    Java数据库编程宝典4

    3.7 将查询结果进行汇总 3.7.1 集合函数 3.7.2 使用HAVING子句来筛选组 3.7.3 使用索引提高SQL查询效率 3.7.4 格式化SQL命令 3.7.5 使用SQL连接 3.7.6 编写SQL的JOIN命令 3.7.7 使用UNION运算符进行组合查询...

    JDBC连接方法总汇

    收集 SQL DB2 MYSQL ORACLE ....等数据库连接的方式方法总汇,附带示例代码

    Java常用代码方法汇总

    java常用代码方法很适合初学者和刚刚参加工作的程序员,里面包含了常用正则表达式、公共日期类、串口驱动、各种数据库连接、公交换乘算法、 列出某文件夹及其子文件夹下面的文件,并可根据扩展名过滤等等很多有用的...

    java连接elasticsearch将搜索结果高亮显示并分页。

    java连接elasticsearch实现全文检索,并且高亮显示结果,实现分页。项目基于elasticsearch5.6.1可根据自己实际情况调整版本。最近项目需要所以学习了一下,项目很简单可以根据你的实际情况更改接口。我本地的搜索是...

    Java JavaWeb 数据库等开发参考手册三

    这是在进行javaee javase开发过程中运用到的所有技术的api(chm格式),对于开发者而言非常方便地进行函数等的查询,是开发者必备的参考资料。由于是汇总,所以资料比较大,就分开上传了,望海涵

    Java—JDBC资料汇总

    jdbc-introduce.pdf Oracle_JDBC_tutorial.pdf 基于JDBC并利用属性文件来配置和实现数据库连接池.pdf 数据库连接池Java实现小结.doc

    课程设计-基于Java web SSH框架的高校在线评价系统(源码+数据库+报告+ppt).zip

    教师教学质量评价系统评价躬耕包括学生评教、领导评教、专家评教、教师评教和家长评教。...系统使用说明:将源码导入java ee工具,导入系统所需的jar包,导入MySQL数据库,修改数据库连接语句,调试运行。

    简易java开源订销管理系统

    1、本订销系统程序默认使用数据为连接池使用的apache commons-dbcp-1.2.1管理数据库连接(tomcat自带),确保该包可用.若要使用其它数据库连接沲,需要修改easyjf-dbo.xml文件中的相应配置。 2、若不能正常访问数据库,...

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

    Java教务管理系统源码 springboot教务系统...数据库连接池:Druid 工具类:Fastjson 储存:七牛。阿里云 。腾讯云 缓存:redis(可选) 开发环境 Idea/eclipse + Maven3 + jdk1.8 + tomcat8 + mysql5.7 + redis(可选)

Global site tag (gtag.js) - Google Analytics