JDBC介绍

55 篇文章 0 订阅
47 篇文章 0 订阅

(一)JDBC方式(Java DataBase Connectivity)包括:

       1、JDBC-ODBC(Open Database Connectivity)桥接(也称ODBC方式):

A)由Sun 与Merant公司联合开发,应用程序只需建立JDBC和ODBC之间的连接,即所谓的JDBC-ODBC桥接器,而和数据库的连接由ODBC完成。这种方法通过建立ODBC数据源而不是直接连接数据库的方式屏蔽了不同数据库的异构性,在需要更换数据库系统时,操作非常简单。然而,这种方法也使得应用程序依赖于ODBC,移植性较差,即应用程序所驻留的计算机必须提供ODBC。原理如图:


              B)需要使用类:sun.jdbc.odbc.JdbcOdbcDriver,包sun.jdbc.odbc 与JDK 一起自动安装, 无需特殊配置。Java 2 SDK 类库中包含了用于JDBC-ODBC桥接驱动程序的类, 因此不再需要安装任何附加包就可以使用。但是客户机需要通过生成数据源名(Data Source Names , DSN)来配置ODBC 管理器。DSN 是一个把数据库、驱动程序、一些可选的设置连接起来的命名配置。

              C)用法:

                    ①进入控制面板→管理工具→数据源(ODBC)->系统DSN;

                    ②在ODBC 数据源管理器中的“ 系统DSN”中添加系统数据源(如果没有找到该数据源的驱动程序则需要下载安装)。 要注意, 一定要用系统(DSN)数据源, 不能用用户(DSN)数据源, 因为servlet 是伪系统(DSN), 所有的jsp 、servlet程序, 需要连接jdbc- odbc 驱动的话, 都只能用系统( DSN) 数据源, 不能用用户( DSN) 数据源。

                    ③

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:dbname",dbuser,dbpwd);
Statement stmt=con.createStatement();

        2、纯JAVA驱动(也称JDBC方式):

               A)这种方法使应用程序不受ODBC的限制,但是Java数据库驱动程序升级后,若访问数据库的应用程序想使用升级版本的驱动程序,就必须重新安装新的驱动程序。原理如图:


              B)根据不同的数据库选用不同的数据库JDBC驱动程序,需要下载对应的.jar包。

Oracle:classes12.zip 或 ojdbc14.jar

Sybase:jconn2.jar 或 jconn3.jar

mysql:mysql-connector-java-5.1.18-bin.jar

SQLServer 2000:msbase.jar、msutil.jar、mssqlserver.jar

SQLServer 2005:sqljdbc.jar或sqljdbc4.jar

SQLServer 7.0:jtds-1.2.2.jar

Informix:ifxjdbc.jar

DB2:db2jcc.jar、db2jcc_license_cu.jar

              C)用法:

                    根据数据库类型不同,格式不同,如下:

                    Oracle:

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@hostip:1521:dbname",dbuser,dbpwd);
Statement stmt=con.createStatement();

                    Sybase:

Class.forName("com.sybase.jdbc2.jdbc.SybDriver");
Connection con=DriverManager.getConnection("jdbc:sybase:Tds:hostip:4100/dbname",dbuser,dbpwd);
Statement stmt=con.createStatement();

                    mysql:

Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://hostip:3306/dbname?useUnicode=true&characterEncoding=GBK",dbuser,dbpwd);
Statement stmt=con.createStatement();

                    SQLServer 2000:

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection con=DriverManager.getConnection("jdbc:microsoft:sqlserver://hostip:1433;DatabaseName=dbname",dbuser,dbpwd);
Statement stmt=con.createStatement();

                    SQLServer 2005:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con=DriverManager.getConnection("jdbc:sqlserver://hostip:1433;DatabaseName=dbname",dbuser,dbpwd);
Statement stmt=con.createStatement();

                    SQLServer 7.0:

Class.forName("net.sourceforge.jtds.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:jtds:sqlserver://hostip:1433/dbname",dbuser,dbpwd);
Statement stmt=con.createStatement();

                    Informix:

Class.forName("com.informix.jdbc.IfxDriver");
Connection con=DriverManager.getConnection("jdbc:informix-sqli://hostip:port/dbname:informixserver=<dbservername>",dbuser,dbpwd);
Statement stmt=con.createStatement();

                    DB2:

Class.forName("com.ibm.db2.jcc.DB2Driver");
Connection con=DriverManager.getConnection("jdbc:db2://hostip:50000/dbname",dbuser,dbpwd);
Statement stmt=con.createStatement();

注意:

当使用JDK提供的java(x).sql包中的类访问数据库时候,基本上用到的就是drivermanager,connection,statement,resultset。其中drivermanger是类,他调用相应的驱动(即各个数据库厂商提供的驱动)中的方法生成connection对象。Connection是接口,在各个数据库厂商提供的数据库驱动中,都实现了该接口。例如:当使用com.mysql.jdbc.driver时候,生成的connection即为com.mysql.jdbc.Connection对象。

(二)数据库连接池

        1、使用连接池的目的:

当使用java.sql中提供的api创建数据库连接时候,需要耗费很大的资源,要进行用户名密码数据库连接验证等,即耗费资源也耗费时间。如果在程序中,每次需要访问数据库时候,都进行数据库连接,那么势必会造成性能低下;同时,如果用户失误忘记释放数据库连接,会导致资源的浪费等。而数据库连接池就是解决该问题,通过管理连接池中的多个连接对象(connection),实现connection重复利用。从而大大提高了数据库连接方面的性能。优势主要体现在:

     1)DataSource用来取代DriverManager来获取Connection,通过DataSource获得Connection速度很快;

     2)通过DataSource获得的Connection都是已经被包裹过的(不是驱动原来的连接),它的close方法已经被修改。

     3)一般DataSource内部会用一个连接池来缓存Connection,这样可以大幅度提高数据库的访问速度;

     4)连接池可以理解成一个能够存放Connection的Collection;

     5)程序只和DataSource打交道,不会直接访问连接池。

        2、连接池的作用:

负责创建,管理,释放,分配数据库连接即(connection)。首先,负责创建相应数目的数据库连接对象(connection)对象,并存放到数据库连接池(connect pool)中。当用户请求数据库连接时,该连接池负责分配某个处于空闲状态的数据库连接对象;当用户发出释放该数据库连接时,该连接池负责将该连接对象重新设置为空闲状态,以便被别的请求重复利用。同时;数据库连接池负责检查(空闲时间>最大空闲时间)的数据库连接,并释放。

        3、连接池主要参数
最小连接数:初始化时,系统将负责创建该数目的connection放入连接池中。
最大连接数:系统允许创建connection的最大数值。当系统请求连接时候,且连接池中不存在空闲的连接:如果connection总数未超过最大连接数,那么连接池负责创建新的connection对象,并返回该对象;如果connection总数已经到达该最大连接数,那么连接池将用户请求转入等待队列。

        4、常用数据库连接池:

              ①JNDI:

        JNDI(Java Naming and Directory Interface ):是SUN公司提供的一种标准的Java命名系统接口,是一组在Java应用中访问命名和目录服务的API。命名服务是将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,它提供了应用编程接口(application programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口—很象JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,不必操心JNDI SPI。只需要确认要使用的每一个命名或目录服务都有服务提供者。

依赖的jar包是:

该数据源是由相应的web服务器(例如:tomcat,weblogic,websphere)负责初始化,创建,管理,所以程序中不需要引入特别的jar包,

实现的datasource类是:Javax.sql.datasource

使用步骤:

1)修改tomcat的conf下的context.xml文件,增加Resource的配置的支持。

<Resource name="jdbc/dbname"
          auth="Container"
          type="javax.sql.DataSource"
          driverClassName="oracle.jdbc.driver.OracleDriver"
          url="jdbc:oracle:thin:@localhost:1521:dbname"
          username="root"
          password="123456"
          maxActive="100"
          maxIdle="30"
          maxWait="10000" />

2)在web.xml下配置资源定义指定的位置,res-ref-name必须与之前定义的name保持一致!

<resource-ref>
     <description>DB Connection</description>
     <res-ref-name>jdbc/dbname</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
 </resource-ref>

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

4)

Context initcontext=new InitialContext();
Context context=(Context) initcontext.lookup("java:comp/env");
DataSource datasource=(DataSource)context.lookup("jdbc/dbname");
Connection con=datasource.getConnection();
Statement stmt=con.createStatement();
注意:

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


              ②C3p0:

该连接池作者是《星球大战》迷,C3P0就是其中的一个机器人,并且这个名称中包含connection和pool的单词字母。因此叫这个名字。

依赖的jar包是:c3p0-0.9.xxx.jar,

实现的datasource类是:com.mchange.v2.c3p0.ComboPooledDataSource

使用方法:

ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/dbname");
ds.setUser("root");
ds.setPassword("123456");
ds.setMaxPoolSize(20);
ds.setInitialPoolSize(10);
ds.setMaxIdleTime(2000);
Connection con=ds.getConnection();
Statement stmt=con.createStatement();

注意:

        数据库连接的具体参数,例如:url,username,password,最小连接数,最大连接数等信息既可以在xml配置文件中配置,也可以通过程序编码方式创建,通常都是通过配置文件,几乎不会用到这的,所种硬编码方式。Spring支持c3p0的数据库连接池方式,因此在spring环境中使用时,支持在applicationcontext.xml文件中配置。另外,由于数据库连接池在整个project中针对某个数据库而言是单例即使通过编码的方式创建,那么要保证其单实例特性。如果存在多个,那么必然会导致性能低下。


              ③Apache 的Jakarta DBCP:

是apache上的一个java连接池项目,也是tomcat使用的连接池组件。单独使用dbcp需要3个包:commons-dbcp.jar、commons-pool.jar、commons-collections.jar

依赖的jar包是:commons-dbcp.jar、commons-pool.jar、commons-collections.jar

实现的datasource类是:org.apache.commons.dbcp.BasicDataSource

使用方法:

BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/dbname");
ds.setUsername("root");
ds.setPassword("123456");
ds.setMaxIdle(20);
ds.setInitialSize(10);
ds.setMaxActive(2000);
Connection con=ds.getConnection();
Statement stmt=con.createStatement();
注意:

        dbcp数据源也支持xml配置文件和硬编码两种方式。通常都是通过配置文件配置,几乎不会使用硬编码方式。DBCP可以直接的在应用程序用使用。

如果使用xml配置,示例如下:

.xml(Struts1.1)

<data-sources>
    <data-source key="datasource" type="org.apache.struts.util.GenericDataSource">
        <set-property property="password" value="admin" />
        <set-property property="minCount" value="2" />
        <set-property property="maxCount" value="10" />
        <set-property property="user" value="admin" />
        <set-property property="driverClass" value="com.mysql.jdbc.Driver" />
        <set-property property="description" value="test" />
        <set-property property="url" value="jdbc:mysql://localhost/test" />
        <set-property property="readOnly" value="false" />
        <set-property property="autoCommit" value="true" />
    </data-source>
</data-sources>
.xml(Struts1.2)
<data-sources>
	<data-source key="datasource" type="org.apache.commons.dbcp.BasicDataSource">
		<set-property property="password" value="admin" />
		<set-property property="minCount" value="3" />
		<set-property property="maxCount" value="10" />
		<set-property property="username" value="admin" />
		<set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
		<set-property property="description" value="test" />
		<set-property property="url" value="jdbc:mysql://localhost/test" />
		<set-property property="readOnly" value="false" />
		<set-property property="autoCommit" value="true" />
	</data-source>
</data-sources>
        如果要配置多个data source,可以给每个data source指定不同的key,然后在程序中根据key指定要引用的数据源。

.java

DataSource ds = getDataSource(request,"datasource");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SQL String");


              ④BoneCP:

依赖的jar包是:

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

实现的datasource类是:BoneCPDataSource

使用方法:

BoneCPDataSource ds = new BoneCPDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/dbname");
ds.setUsername("root");
ds.setPassword("123456");
Connection con = ds.getConnection();
Statement stmt = con.createStatement();

注意:

BoneCP是快速高效的数据库连接池组件,据说性能上目前是最好得,比C3P0和DBCP快25倍。


其中,sping框架依赖的第三方使用了c3p0和dbcp两种方式,JNDI方式创建实现的datasource是真正实现了javax.sql.datasource;其他的三种方式都不是。这几种连接池参数的配置,既可以通过配置文件的方式配置,也可以通过硬编码的方式配置,但应该尽量使用配置的方式,便于维护和管理。


        5、其它连接池

       ①Proxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。

       ②DDConnectionBroker DDConnectionBroker是一个简单,轻量级的数据库连接池。

       ③DBPool DBPool是一个高效的易配置的数据库连接池。它除了支持连接池应有的功能之外,还包括了一个对象池使你能够开发一个满足自已需求的数据库连接池。

       ④XAPool XAPool是一个XA数据库连接池。它实现了javax.sql.XADataSource并提供了连接池工具。

       ⑤Primrose Primrose是一个Java开发的数据库连接池。当前支持的容器包括Tomcat4&5,Resin3与JBoss3.它同样也有一个独立的版本可以在应用程序中使用而不必运行在容器中。Primrose通过一个web接口来控制SQL处理的追踪,配置,动态池管理。在重负荷的情况下可进行连接请求队列处理。

       ⑥SmartPool SmartPool是一个连接池组件,它模仿应用服务器对象池的特性。SmartPool能够解决一些临界问题如连接泄漏(connection leaks),连接阻塞,打开的JDBC对象如Statements,PreparedStatements等. SmartPool的特性包括支持多个pools,自动关闭相关联的JDBC对象, 在所设定time-outs之后察觉连接泄漏,追踪连接使用情况, 强制启用最近最少用到的连接,把SmartPool"包装"成现存的一个pool等。

       ⑦MiniConnectionPoolManager MiniConnectionPoolManager是一个轻量级JDBC数据库连接池。它只需要Java1.5(或更高)并且没有依赖第三方包。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值