`
jguangyou
  • 浏览: 375696 次
  • 性别: 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倍。

分享到:
评论

相关推荐

    JAVA仓库管理系统源代码 含SQL数据库

    【JAVA仓库管理系统源代码 含SQL数据库】 Java仓库管理系统是一种基于Java编程语言开发的应用程序,主要用于企业或组织内部的库存管理和控制。该系统利用Java的面向对象特性、稳定性和跨平台兼容性,实现了对仓库...

    Java水晶报表开发技术

    2. 数据源连接:水晶报表支持多种数据源,如关系型数据库(如MySQL、Oracle)、NoSQL数据库、Web服务等。开发者需要配置数据源连接,以便报表能从中获取数据。 3. 查询和过滤:在报表设计阶段,可以定义SQL查询来...

    Java学习基础汇总

    数据源是数据库连接的管理方式,可以通过ODBC数据源进行配置: - 打开【控制面板】,进入【管理工具】,然后选择【数据源(ODBC)】。 - 在【系统DSN】选项卡中,点击【添加】,选择对应的数据库驱动(如MySQL),...

    Java—JDBC资料汇总

    - 数据源(DataSource)是JDBC连接数据库的推荐方式,它提供了比DriverManager更高效、更安全的连接管理。 - JDBC URL用于指定数据库的访问路径,如"jdbc:mysql://localhost:3306/mydatabase"。 3. JDBC事务管理...

    Java IO处理类的汇总

    Channels代表连接到数据源或目标的通道,Selector用于多路复用多个通道,Buffers则替代了传统IO中的缓冲区。 过滤流(Filter Stream)是Java IO的一个重要设计模式,它在原有流的基础上增加额外功能,如数据转换、...

    java报表最优解决方案

    - **数据运算**:支持数据的分组、排序、过滤、汇总、连接等高级运算。 - **公式引擎**:内置超过100个函数,包括数据集引用、单元格函数、字符串函数、数学函数、日期函数等。 - **图表**:提供仪表盘、双轴柱线图...

    Crystal Reports for java jsp web 案例

    3. **数据源配置**:在Web应用中配置数据源,通常是通过JNDI(Java Naming and Directory Interface)查找或直接使用Java数据库连接(JDBC)。 4. **生成报表**:在Java代码中,创建ReportDocument对象,加载.RPT...

    Java开发的RSS项目

    1. **连接数据库**:使用ojdbc驱动连接到Oracle数据库,获取需要展示在RSS feed中的数据。 2. **构建RSS结构**:使用Rome库创建RSSChannel和RSSItem对象,填充必要的信息,如频道标题、描述、链接以及条目的标题、...

    智能电表远程抄表缴费管理平台JAVA源码

    智能电表远程抄表缴费管理平台JAVA源码是一款基于JAVA技术构建的物联网应用,主要用于实现对各类主流品牌智能电表的远程数据采集和自动化管理。该平台具备高度的兼容性,能够支持正泰电表、人民电表、天正电表和许继...

    学生信息管理JAVA数据库sql,access

    在JAVA中,可以通过JDBC(Java Database Connectivity)驱动连接并操作ACCESS数据库,实现数据的读写。 系统的核心功能包括: 1. 学生信息管理:录入、修改、删除学生的个人信息,如姓名、学号、年级、班级等。 2....

    java数据库访问服务汇总

    - **JNDI**(Java Naming and Directory Interface):由Web服务器(如Tomcat、WebLogic、WebSphere)管理数据源,不需要额外引入jar包,直接实现`javax.sql.DataSource`接口。 - **C3P0**:依赖`c3p0-0.9.x.jar`...

    Java资料习题集汇总

    本章节主要涵盖了Java的基础知识,包括环境配置、基本语法、数据类型、运算符、流程控制等内容,并通过一系列习题帮助初学者巩固理解。 1. **Java的特点**: Java的特点包括:跨平台性(Write Once, Run Anywhere...

    项目实战——Spark将Hive表的数据写入ElasticSearch(Java版本)

    1. **Hive数据源**: Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL语法进行数据查询和分析。在本项目中,我们首先需要从Hive表中提取数据。Hive提供了丰富的接口供外部应用访问,包括Hive JDBC和Hive ...

    java工资管理系统(J2SE)

    在配置和运行该系统时,首先需要在本地计算机上安装Access,并设置好数据源(Data Source Name, DSN)。DSN是连接到特定数据库的桥梁,使得Java应用程序能够通过ODBC(Open Database Connectivity)接口与Access进行...

    运动会成绩管理系统,java课程设计源代

    同时,为了持久化数据,系统会连接到数据库,如MySQL或SQLite,通过SQL语句进行数据的增删改查。 四、业务逻辑处理 业务逻辑层是系统的核心部分,涉及到成绩计算、排名生成等。例如,根据比赛成绩计算每个项目的...

    学习笔记汇总-JAVA

    2. **建立连接**:`Connection con = DriverManager.getConnection("jdbc:odbc:数据源名","","");` - 需要在系统中预先配置ODBC数据源。 - ACCESS数据库的用户名和密码通常为空。 ### 2. 关闭IE输入框的自动完成...

    JAVA项目-简易网吧管理系统

    在本项目中,JDBCTemplate被用来连接Oracle数据库,这是一个广泛使用的高性能关系型数据库,特别适合处理大量数据的场景。 Oracle数据库的使用意味着项目可能涉及了复杂的表结构设计,包括用户信息、上网记录、费用...

    JAVA 类名与库汇总表

    1. **Scanner**:来自`java.util.Scanner`库,Scanner类提供了从各种输入源(如键盘、文件、系统输入流)读取基本类型数据和字符串的能力。它可以解析基本类型的值,例如整数、浮点数,甚至可以读取用户输入的完整...

    Java水晶报表 Java水晶报表.ppt

    该工具由Business Objects公司(现为SAP的一部分)开发,特别适合与Java应用程序集成,提供丰富的报告功能,帮助开发者从各种数据源提取、分析和呈现数据。 水晶报表的主要特点包括: 1. **报表设计灵活性**:...

    java名词汇总说明文档

    Java提供了多种流类,如InputStream、OutputStream、Reader、Writer等,用于操作文件、网络连接等数据源。流的概念简化了数据传输的操作,使得程序员能够更加专注于业务逻辑而非底层细节。 #### 序列化...

Global site tag (gtag.js) - Google Analytics