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

JAVA的数据源连接方式 (硬编码)

    博客分类:
  • java
阅读更多
最近在研究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连接数据库+之+建立数据源

    Java连接数据库的过程主要涉及到数据源(DataSource)的建立,这是Java应用程序与数据库交互的重要环节。在本场景中,我们以Windows环境下的Web服务器为例,详细解释如何通过ODBC(Open Database Connectivity)数据...

    JNDI配置数据源在java web开发中的使用

    在Java代码中,我们可以使用以下方式获取数据源: ```java Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:/comp/env"); DataSource ds = (DataSource) envCtx....

    JavaWeb:Tomcat下配置数据源连接数据库.pdf

    Java Web技术中使用Tomcat作为Web服务器的应用较为广泛,其中配置数据源连接数据库是Java Web应用程序开发和部署的一个重要方面。数据源(DataSource)是JDBC的一个接口,它使得应用程序能够以一种标准的方式获取...

    java多数据源案例使用项目

    在Java开发中,面对多个数据源的管理问题,企业通常会采用数据源切换或动态数据源(Dynamic Data Source)技术来实现。这个"java多数据源案例使用项目"旨在解决的就是这种需求,允许一套业务代码无缝对接不同数据库...

    mybatis-plus+动态数据源

    动态数据源是指程序运行时能够根据业务需求动态选择要操作的数据源,而不是硬编码固定的数据库连接。这种技术在分布式系统、微服务架构中非常常见,可以方便地支持多个数据库的切换,如读写分离、数据库分片等场景...

    websphere数据源间接映射手册

    在这种方法中,应用程序在运行时通过JNDI服务查找数据源,而不是硬编码数据源的引用。这允许应用程序在不修改代码的情况下使用不同的数据源,增强了可移植性和可扩展性。 "lookup"操作在WebSphere中指的是通过JNDI...

    T10数据源与连接池ppt

    【T10数据源与连接池】是关于Java Web应用程序中使用JDBC连接数据库的一种优化策略,主要解决了传统JDBC方式存在的资源浪费和安全性问题。数据源和连接池的概念是解决这些问题的关键。 **1. 数据源(DataSource)**...

    数据源所需jar.rar

    在Java EE应用中,数据源通常通过JNDI查找服务被应用程序获取,这样可以在不硬编码数据库连接信息的情况下实现灵活的配置。 3. **连接池**: 数据源通常会集成连接池技术,如C3P0、HikariCP、Apache DBCP、Druid等。...

    数据源配置(Tomcat)讲解

    这里,`name`是数据源的JNDI名称,`auth`指明认证方式,`type`是数据源类型,`driverClassName`是数据库驱动,`url`是数据库连接地址,`username`和`password`是数据库登录凭证,`maxActive`, `maxIdle`和`maxWait`...

    springboot多数据源配置

    在Java中,数据源是连接数据库的中间件,它负责管理和提供数据库连接。Spring Boot默认支持多种数据源,如HikariCP、Tomcat JDBC等,这些数据源提供了更高效的连接池管理。 在Spring Boot中配置多数据源,主要涉及...

    java动态切换多数据源

    在Java开发中,多数据源是指应用程序可以连接和操作多个不同的数据库。这在大型系统或者分布式环境中非常常见,比如在微服务架构中,每个服务可能有自己的数据存储,或者是需要实现读写分离、数据冗余备份等场景。...

    WAS6.1使用数据源用到的jar(包括base.jar)

    - 数据源连接池的管理和优化 - 针对不同数据库的JDBC驱动使用 在实际应用中,理解并掌握这些概念对于确保应用程序的稳定性和性能至关重要。正确配置和使用数据源可以提高系统的可扩展性,减少数据库连接的开销,并...

    配置数据源,数据库资料

    本文将根据提供的文件信息(标题、描述、标签以及部分内容)来详细解析其中涉及的关键知识点,包括数据源的基本概念、如何配置数据源连接数据库的具体参数及其含义等。 ### 数据源的基本概念 数据源(DataSource)...

    struts 数据源配置

    对于大型应用而言,数据源配置是连接数据库与应用程序之间的桥梁,它对系统的性能和稳定性具有重要影响。本文将详细介绍如何在Struts开发中配置数据源,特别是使用`org.apache.commons.dbcp.BasicDataSource`作为...

    动态创建切换数据源.zip

    这个策略可以是简单的硬编码逻辑,也可以是通过查询服务获取的动态策略。 3. **数据源切换**: 在`@Transactional`注解的方法内部,根据策略获取当前应使用的数据源,然后使用`AbstractRoutingDataSource`进行切换。...

    tomcat6连接池 数据源配置

    - **安全性**:确保数据库连接信息的安全性,不要将敏感信息硬编码在配置文件中。 - **性能调优**:根据实际应用场景调整 `maxActive`、`maxIdle` 和 `maxWait` 等参数,以达到最佳性能。 - **兼容性**:检查所使用...

    配置 JNDI 数据源

    2. 代码解耦:应用不再需要硬编码数据库连接信息,提高了代码的可维护性。 3. 可移植性:不同应用可以共享同一数据源,降低跨环境迁移的难度。 4. 性能优化:JNDI数据源通常采用连接池技术,提供高效的连接复用,...

    连接数据库JAVA类文件

    描述中的"一个资源文件,一个数据源连接文件和一个DBO处理文件"揭示了实现这一功能的三个关键组成部分。 1. **DBConnection.java**: 这个文件很可能是主要的数据库连接类。在Java中,我们通常使用`java.sql....

    springboot配置多数据源

    数据源是Java中用于存储数据库连接的容器,它提供了获取数据库连接的方法,通常由连接池来实现,如HikariCP、Druid等,以提高系统性能。 1. **配置多数据源基础** 在Spring Boot中,我们可以通过`application....

    解密JBoss和Weblogic数据源连接字符串和控制台密码 _ WooYun知识库1

    ### 解密JBoss和Weblogic数据源连接字符串和控制台密码 #### 0x00 背景 随着互联网技术的发展与应用的多样化,Java作为企业级开发的重要语言之一,其相关的应用框架如JBoss和WebLogic越来越受到广泛的应用。这类...

Global site tag (gtag.js) - Google Analytics