`
chineseoa
  • 浏览: 102951 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

不同DataSource类对Oracle数据库url的识别

阅读更多

使用Spring辅助Hibernat操作Oracle数据库,驱动使用 classes12.jar ,先在配置文件applicationContext.xml中配置DataSource,初始使用内

置的DriverManagerDataSource作试验,连接数据库、CRUD记录均无错。这时配置文件中有关dataSource的配置信息如下:

    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jbdc:oracle:thin:@172.16.0.220:1521:enterinfo"/>
        <property name="username" value="enterinfo"/>
        <property name="password" value="enterinfo"/>
    </bean>

在其它内容均不动的情况下,单纯将DriverManagerDataSource改为Apache DBCP的BasicDataSource, 报错:

Exception in thread "main" org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class

'oracle.jdbc.driver.OracleDriver' for connect URL ':oracle:thin:@172.16.0.220:1521:enterinfo'
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1150)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
    at Test.main(Test.java:16)
Caused by: java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(Unknown Source)
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1143)
    ... 2 more

没合适的驱动是因为驱动程序没有加载吗?不对,刚使用DriverManagerDataSource一点问题均没有。还是因为BasicDataSource类名写错,如

果是这样应该抛ClassNotFoundException,也不对。只有一种可能:URL写错。仔细检查,j,d,b,c,冒号 ...。果不其然,将 jdbc 写成 jbdc

。改正,一切又恢复正常。

真粗心啊!懊恼之余,想想:Spring真神奇,能自动纠正url的错误?能实例化Bean对象、装配对象间关系,管理对象生命周期,还能...? 不

可能!JDBC中DriverManager也好,Spring中DriverManagerDataSource也好以及DBCP的BasiceDataSource也好,无非是对Driver对象的进一步

包装,真正创建连接,识别判断URL正误的是java.sql.Driver接口的实现类,而该类是Oracle官网所下。以此作为指导方向,怀着打破砂锅问

到底的态度,向源码进发:

先打开DriverManagerDataSource的源码(Spring2.5.1版本),虽然Spring 2.5.1版本出来不久,但该类创建时间却较早:since 14.03.2003。找

到 getConnection()方法处,只有一行代码:

return getConnectionFromDriverManager();

再看 getConnectionFromDriverManager(),又只有一行,转而调用 getConnectionFromDriverManager(getUsername(), getPassword());而后

面这个方面也简单,将用户名称和密码封装成 Properties 对象,转而调用 getConnectionFromDriverManager(String url, Properties

props)。最后在该方法中找到建立连接最核心的代码:

return DriverManager.getConnection(url, props);

看到这,我们能理解,为什么说Spring的DriverManagerDataSource没有连接池化功能了。DriverManager.getConnection()无非转而调用

Driver.connect()方法,难道真的是Oracle的驱动问题?继续实验,写一个最简单的JDBC连接程序:

        String     driverName="oracle.jdbc.driver.OracleDriver";
        String     url="jbdc:oracle:thin:@172.16.0.220:1521:enterinfo";
        String     username="enterinfo";
        String     password="enterinfo";
        Connection conn=null;

        try{
            Class.forName(driverName);
            conn=DriverManager.getConnection(url,username,password);           
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            if(conn!=null) try {conn.close();}catch(Exception e){}
        }
        System.out.println(conn);

刻意将url第一个单词 jdbc 写成 jbdc, 能正确连接。写成 jaaa, 能正确连接,写成 aaaa, 能正确连接。去掉,能正确连接。实验结果表明

,这时Oracle驱动压根就未对第一个冒号前的内容进行验正。

至此,粗步得到结论:DriverManagerDataSource仅是对DriverManager的getConnection(url,username,password)进行了简单包装。

那Apache的DBCP中BasicDataSource呢?打开BasicDataSource,同样定位至getConnection()方法处。该方法也是一行:return

createDataSource().getConnection(); 继承定位至 createDataSource() 方法,这个方法就较复杂一点,结合之前的错误提示(at

org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1150)),将目光聚焦在该方法接下来几行:

1140        // Create a JDBC driver instance
1141        Driver driver = null;
1142        try {
1143            driver = DriverManager.getDriver(url);
1144        } catch (Throwable t) {
1145            String message = "Cannot create JDBC driver of class '" +
1146                (driverClassName != null ? driverClassName : "") +
1147                "' for connect URL '" + url + "'";
1148            logWriter.println(message);
1149            t.printStackTrace(logWriter);
1150            throw new SQLNestedException(message, t);
1151        }

这段代码能抛出异常的地方就是第1143行,driver = DriverManager.getDriver(url); 至此,DriverManagerDataSource较之BasicDataSource

能所谓的纠正url错误的地方,就体现在DriverManager类的二个方法上:

DriverManagerDataSource -> DriverManager.getConnection(url,username,password)
BasicDataSource         -> DriverManager.getDriver(url)

如果 url 第一个冒号写错或不写,对于Oracle数据库,getConnection(...)能正确获得连接,getDriver(...)会报错。继续深入

java.sql.DriverManager类的源码,首先看 getConnection(...), 该方法中遍历多个所加载的Driver接口的实现类,转而调用

java.sql.Driver的connect(url,pro)方法,最核心的代码是第582行:

Connection result = di.driver.connect(url, info);

再看 getDriver(url) 方法, 最核心的代码是第252行。

252   if (di.driver.acceptsURL(url)) {
253       // Success!
254       println("getDriver returning " + di);
255       return (di.driver);
256   }

该方法如果能接受指定的url, 就返回正确的Driver接口,否则接下来就报错。因此问题的焦点便集中在Driver接口的二个方法上:

方法一:Driver.connect(url,info);
方法二:Driver.acceptsURL(url);

方法一,对于Oracle数据库, 不判断url中第一个冒号前内容正误。而acceptsURL则因url不正确而抛异常。继续前进,源码...? 因不能
获得Oracle数据库有关Driver接口的实现类源码,这个问题看来就此止步。如果说还有什么细节的话,可以继续看看不同的驱动是否会有
不同的表现。顺便说一下,之前的数据库驱动是 classes12.jar, 现在换成ojdbc14.jar。为了得到更全面结果,进一点试验MySQL数据库,所

使用驱动为mysql-connector-java-5.0-nightly-20071116-bin.jar, 试验结果:

在url第一个冒号错误时:

                                        classes12.jar          ojdbc14.jar         mysqlXXX.jar

方法一:Driver.connect(url,info);  -> 正确返回连接             -> 正确返回连接     -> 不能返回连接
方法二:Driver.acceptsURL(url);    -> 返回false                -> 返回true         -> 返回false

因没有Oracle数据库驱动源码,问题分析就此止步。回首分析的路程:

DriverManagerDataSource.getConnection()                             ->
DriverManager.getConnection(url,pro)                                ->
Driver.connect(url,pro);

BascicDataSource.getConnection()                                    ->
首先通过DriverManager.getDriver(url)获得Driver对象,再进一点创建连接->
Driver.acceptsURL(url);

结论:

在使用驱动classes12.jar连接Oracle数据库,
. 使用DriverManagerDataSource创建连接底层依赖的Driver.connect(url,info)不对url第一个冒号前内容正误作判断;
. 使用BasicDataSource创建连接底层依赖的Driver.acceptsURL(url)对url第一个冒号前内容正误作判断;

2
0
分享到:
评论

相关推荐

    Eclipse是如何连接Oracle数据库的

    而Oracle数据库则是业界领先的数据库管理系统之一,常用于存储、处理大量的企业级数据。因此,如何在Eclipse中连接Oracle数据库,是许多开发者必须掌握的一项技能。下面将详细解析Eclipse连接Oracle数据库的过程与...

    SpringBoot整合Oracle数据库使用双数据源

    本文将详细讲解如何利用SpringBoot整合Oracle数据库实现双数据源的配置和使用,帮助开发者构建可扩展、高可用的应用系统。 首先,我们需要理解"双数据源"的概念。双数据源意味着应用程序可以同时访问两个不同的...

    WMB 使用Compute节点连接Oracle数据库实例

    4. **JDBC驱动**:确保已经安装了适用于Oracle的JDBC驱动,比如ojdbc.jar,并将其添加到WMB的类路径中,以便WMB能够识别并使用Oracle数据库。 5. **SQL操作**:在Compute节点内部,可以编写Java代码来执行SQL查询、...

    weka连接oracle数据库

    将下载的JDBC驱动添加到Weka的类路径中,这样Weka才能识别并连接到Oracle数据库。 2. **配置数据库连接参数**:在Weka中,你可以通过编写Java代码或者使用特定的Weka数据源来实现数据库连接。你需要提供数据库的...

    oracle数据库

    一旦配置好数据源,就可以在Java代码中使用`java.sql.DriverManager`或`javax.sql.DataSource`接口来建立与Oracle数据库的连接。下面是一个简单的示例代码: ```java import java.sql.Connection; import java.sql....

    idea安装oracle驱动

    ojdbc6.jar是Oracle为JDBC提供的一个实现,包含了Oracle数据库的Java接口和类,使得Java程序能够通过JDBC API与Oracle数据库进行交互。因此,安装Oracle驱动的第一步就是在本地计算机上找到ojdbc6.jar文件。通常,这...

    weblogic+Oracle数据库连接池的配置

    ### WebLogic与Oracle数据库连接池配置详解 #### 一、WebLogic Server 7.0 + Oracle JDBC Pool/DataSource配置步骤 在进行WebLogic Server 7.0与Oracle数据库的连接池配置时,需要确保以下几个方面的正确设置: #...

    在Tomcat服务器下使用连接池连接Oracle数据库

    - **Oracle JDBC驱动**:`oracle.jdbc.OracleDriver`是Oracle提供的JDBC驱动类,它使得Java应用程序能够与Oracle数据库进行通信。驱动类名在`context.xml`的`driverClassName`属性中指定。 - **validationQuery**:...

    配置datasource

    为了使Tomcat能够识别和加载数据库驱动,需要将数据库驱动程序(如Oracle的三个驱动文件)以及数据源的两个配置文件拷贝到Tomcat的`common/lib`目录下。这一步是数据源配置的核心部分,因为正确的驱动程序和配置文件...

    MyEclipse链接oracle连接池的创建

    Oracle数据库的JDBC驱动提供了对连接池的支持。 步骤1:添加Oracle JDBC驱动 在创建连接池之前,你需要确保已经安装了Oracle数据库,并且拥有对应的JDBC驱动。通常,这个驱动文件ojdbc14.jar可以在Oracle的安装目录...

    Linux 下 Tomcat 7 连接 Oracle 10g

    Oracle数据库的JDBC驱动通常以`.zip`格式提供,如`classes12.zip`。但Tomcat只会识别`.jar`格式的文件。因此,你需要将`classes12.zip`重命名为`classes12.jar`。这个步骤非常简单,只需通过命令行或者图形界面进行...

    Websphere下oracle连接池的配置

    8. **数据存储器Helper类名**:指定Oracle 10g的特定数据库驱动类,如`Oracle 10g Data Store Helper`,以适配Oracle数据库。 9. **测试连接**:配置完成后,通过“测试连接”确保配置正确,能够成功连接到Oracle...

    配置文件+类加载器(单例模式)连接数据库

    总之,配置文件+类加载器(单例模式)连接Oracle数据库是一种常见且高效的方法。配置文件提供灵活的参数管理,类加载器确保驱动类的正确加载,而单例模式的连接池则优化了连接的创建和复用,降低了系统的资源消耗。...

    Oracle驱动说明,解释Oracle的驱动

    在Oracle数据库的版本发展过程中,对数据库的标识机制进行了改进,从传统的SID(System Identifier)逐渐过渡到服务(Service)机制。SID曾是识别数据库实例的主要方式,但在8.1.7版本后,Oracle引入了服务概念,...

    tomcat5.5 oracle驱动包

    这个驱动包通常包含一个名为`ojdbc.jar`的文件,它包含了所有必要的类和资源,使得Tomcat可以识别并连接到Oracle数据库。 安装Oracle驱动包的步骤如下: 1. **下载驱动包**:首先,你需要从Oracle官方网站或可靠的...

    ojdbc包oracle 10的驱动包

    在Oracle 10g版本中,驱动包被命名为`ojdbc14.jar`,这个文件包含了所有必要的类和资源,让Java应用程序能够识别并处理Oracle数据库的SQL语句。这个JAR文件需要被添加到Java的类路径(ClassPath)中,以便运行时系统...

    JBoss 下配置 Oracle 数据源

    * connection-url:修改为 jdbc:oracle:thin:@localhost:1521:orcl,以连接到本地的 Oracle 数据库。 * driver-class:修改为 oracle.jdbc.driver.OracleDriver,以指定 Oracle 的 JDBC 驱动程序。 * user-name 和 ...

    java连接oracle的jar包.zip

    然后,Spring Boot会自动识别并建立到Oracle数据库的连接。 总的来说,ojdbc7.jar是Java开发者与Oracle数据库交互的重要工具,无论是在传统的SSM框架还是现代化的Spring Boot框架中,都能发挥关键作用。正确配置和...

    MyEclipse+Tomcat+Oracle环境配置-jdk环境变量配置.pdf

    此外,还需在`context.xml`或`server.xml`中配置数据源(DataSource),定义JNDI名称、数据源URL、驱动类等,以便应用程序能通过JDBC连接Oracle数据库。 5. **TOMCAT的部署和运行**:在MyEclipse中,通过...

    Oracle 11g 驱动

    Oracle 11g 提供了两种不同版本的驱动,即OJDBC5和OJDBC6,它们主要的区别在于对Java Development Kit (JDK) 版本的支持。 1. OJDBC5驱动:这个驱动是针对JDK 5.0设计的。如果你的开发环境使用的是Java 5,那么你...

Global site tag (gtag.js) - Google Analytics