`
cuisuqiang
  • 浏览: 3956277 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3666810
社区版块
存档分类
最新评论

Oracle JDBC 连接时的一个BUG

阅读更多

前两天接到一个工作,某网站无法访问了,重启后也一直挂在哪里,起不来。

我刚开始怀疑是程序配置问题,后来发现,只要初始化Spring内容服务就起不来。看了一下spring配置文件里面配置了两个数据源,都是由tomcat管理的jndi数据源。查看了一下发现有一个数据源有问题,使用小程序测试,发现无法连接该数据库,同时也发现一个问题,程序一直挂在哪里,是否能连接却不再返回结果。

 

网上也有人遇到过这类问题,看来都没有很好的解决方案,当然,我也没有。

我现在只是说明一下问题,并复现一下场景。

你可以使用附件内调试工具或自己下载一个TCP调试工具,然后开启一个端口,然后写一个小程序把这个端口当成Oracle服务端口去访问。

 

 

package com;
import java.sql.Connection;
import java.util.Properties;
import oracle.jdbc.driver.OracleDriver;
/**
 * 数据库连接对象管理类
 * @说明
 * @author cuisuqiang
 * @version 1.0
 * @since
 */
public class ConnectionManager {
	private static final String url = "jdbc:oracle:thin:@192.168.1.155:1521:orcl";
	private static final String username = "scott";
	private static final String userpass = "bi123";
	public static void main(String[] args) throws Exception {
		Connection conn = getConnection("1");
		if (null != conn) {
			System.out.println(conn.toString());
		} else {
			System.out.println("NO LINK");
		}
	}
	public static Connection getConnection(String tar) {
		Connection conn = null;
		try {
			OracleDriver driver = new OracleDriver();
			Properties properties = new Properties();
			properties.put("user", username);
			properties.put("password", userpass);
			conn = driver.connect(url, properties);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
}

 

看服务窗口:

 

可以看到,程序发来了登录信息,但是我们不回复,然后就会看到,程序死在了:

conn = driver.connect(url, properties);

 获得连接这里!

 

请您到ITEYE看我的原创:http://cuisuqiang.iteye.com

或支持我的个人博客,地址:http://www.javacui.com

 

4
4
分享到:
评论
13 楼 魔力猫咪 2013-01-15  
cuisuqiang 写道
魔力猫咪 写道
首先应用服务器可以Ping通数据库服务器吗?数据库服务器本身服务是否正常?别的机器可以访问不?首先要排除网络和数据库本身的问题。

我说的问题是,该端口可用,但是发送登录连接后不给回应,就会造成挂起的现象


我只问一个,数据库服务器能否正常提供访问。其他的计算机能否连接到数据库。你查什么TCP的都是找错了方向。首先应该确认的就是数据库服务器是否可用。端口可以连接,表示数据库服务器的监听是启动的。但是数据库服务器本身是否正常则是另一个问题。最简单的办法,你在自己机器上面用sqlplus连接数据库。能连接就表示是应用服务器到数据库服务器之间的网络有问题,或者应用服务器上面的代码配置有问题。不能连接,就直接去数据库服务器上面看其数据库应用是否正常。应用正常,查网络。应用不正常,看数据库错误日志。
这里不要纠结于什么JDBC。如果系统之前没有修改,那么代码和配置出问题的可能性很小。因为这个系统你们以前应该是正常服务的。如果最近有修改,最简单的测试办法就是回退到上一个版本。
简单的排除都没做,非要死扣TCP端口。
12 楼 cuisuqiang 2013-01-14  
huaye2007 写道
连接会有超时的。

所以说是个BUG呀
11 楼 cuisuqiang 2013-01-14  
rainsilence 写道
有没有类似于setTimeout之类的方法。

JDK接口是有定义,不过Oracle的驱动好像没有实现,设置后没有效果
10 楼 huaye2007 2013-01-14  
连接会有超时的。
9 楼 rainsilence 2013-01-14  
有没有类似于setTimeout之类的方法。
8 楼 cuisuqiang 2013-01-14  
我说的问题是,该端口可用,但是发送登录连接后不给回应,就会造成挂起的现象
shenliuyang 写道
oracle连接数限制问题有木有

我说的问题是,该端口可用,但是发送登录连接后不给回应,就会造成挂起的现象!这不属于Oracle服务的事情,而是JDBC连接包实现的问题,我给的工具随意开一个端口即可测试这个现象
7 楼 shenliuyang 2013-01-14  
oracle连接数限制问题有木有
6 楼 cuisuqiang 2013-01-14  
魔力猫咪 写道
首先应用服务器可以Ping通数据库服务器吗?数据库服务器本身服务是否正常?别的机器可以访问不?首先要排除网络和数据库本身的问题。

我说的问题是,该端口可用,但是发送登录连接后不给回应,就会造成挂起的现象
5 楼 cuisuqiang 2013-01-14  
panggezi 写道
为什么我没看到熟悉的forName

Class.forName(driver);

只是告诉加载器使用那个驱动类,我已经显示的使用OracleDriver驱动类了,所以不用再forName
4 楼 cuisuqiang 2013-01-14  
shenliuyang 写道
Connection conn = null; 
        try { 
            OracleDriver driver = new OracleDriver(); 
            Properties properties = new Properties(); 
            properties.put("user", username); 
            properties.put("password", userpass); 
            conn = driver.connect(url, properties); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return conn; 

换种写法!~   官方推荐的写法你不写, 弄要换个花样折腾。 万一有啥操作步骤不同呢。

大家以往的写法都是这样的:
Class.forName(driver);
conn = DriverManager.getConnection(url, username, userpass);

你可以下载官方示例看看人家是怎样写的,并不是我折腾!
3 楼 魔力猫咪 2013-01-14  
首先应用服务器可以Ping通数据库服务器吗?数据库服务器本身服务是否正常?别的机器可以访问不?首先要排除网络和数据库本身的问题。
2 楼 panggezi 2013-01-14  
为什么我没看到熟悉的forName
1 楼 shenliuyang 2013-01-14  
Connection conn = null; 
        try { 
            OracleDriver driver = new OracleDriver(); 
            Properties properties = new Properties(); 
            properties.put("user", username); 
            properties.put("password", userpass); 
            conn = driver.connect(url, properties); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return conn; 

换种写法!~   官方推荐的写法你不写, 弄要换个花样折腾。 万一有啥操作步骤不同呢。

相关推荐

    Oracle JDBC驱动11.2.0.4

    在11g Release 2版本中,11.2.0.4是一个重要的维护版本,包含了一些性能优化、bug修复和新特性。 1. **JDBC驱动类型**: Oracle JDBC驱动主要有四种类型: - ** Thin Driver**: 这是一个轻量级的纯Java驱动,无需...

    mysqljdbc.jar;oraclejdbc.jar

    oraclejdbc.jar”提到了两个重要的Java数据库连接驱动,分别是MySQL的JDBC驱动和Oracle的JDBC驱动。JDBC(Java Database Connectivity)是Java中用于与各种数据库进行交互的一种标准接口,它允许Java程序通过Java ...

    Oracle JDBC Drivers release 11.2.0.3.0.rar

    remote Oracle databases. - JDBC Server-side Internal Driver 11R2 Server-side JDBC driver for use by Java Stored procedures. This driver used to be called the "JDBC Kprb Driver".

    Oracle jdbc for 11g 最新版 驱动 ojdbc6.jar

    从9.0.1开始的每个release都推荐使用oracle.jdbc。这一天终于到来,在11g中,引用oracle.jdbc.driver不再通过编译。  3.j2se 1.2,1.3,1.4不再支持。11R1不再包括这些版本的jar和zip,如果仍然使用这些版本,可以...

    Oracle jdbc for 11g 最新版 驱动 ojdbc6dms.jar

    从9.0.1开始的每个release都推荐使用oracle.jdbc。这一天终于到来,在11g中,引用oracle.jdbc.driver不再通过编译。  3.j2se 1.2,1.3,1.4不再支持。11R1不再包括这些版本的jar和zip,如果仍然使用这些版本,可以...

    Oracle 11.1.0.7.0 JDBC 包

    Oracle11.1.0.7.0 驱动包。完全解决Oracle11驱动BUG,包含 ojdbc5.zip,ojdbc5_g.zip,ojdbc6.zip,ojdbc6_g.zip只要将4个包覆盖\11.1.0\db_1\jdbc\lib下,就OK。亲测

    Oracle11 的ojdbc 去除了bug

    1. ojdbc6_g.jar:这是一个包含调试信息的ojdbc6驱动版本,"g"代表"debug",它对于开发者追踪和调试驱动中的问题非常有用。 2. ojdbc5_g.jar:同样,这个是ojdbc5驱动的调试版本,适用于JDK 5.0。 3. ojdbc6.jar:这...

    连接Oracle数据库所需jar包

    其中,Thin Driver是最常用的一种,它是一个纯Java实现的驱动,不需要Oracle客户端软件,可以直接与数据库服务器通信,适用于跨平台的网络环境。 2. **ojdbc5、ojdbc6和ojdbc14**: - **ojdbc5.jar**: 这个版本的...

    达梦数据库连接方式及jdbc驱动包.rar

    使用的是达梦7,这个数据库有很多BUG,官方提供的客户端,不仅卡,而且登录了后,使用Java JDBC操作更新时,是会被阻塞的,所以,在使用Java开发达梦应用时候,尽量关闭他客户端。 另外达梦还有个模式的概念,这...

    JDBC连接数据库mysql驱动

    在Java中,连接到MySQL通常需要引入一个名为"mysql-connector-java"的JAR包,这个包包含了驱动程序,使得Java应用程序能够识别并通信MySQL服务器。 描述中提到的"用于java连接mysql数据库的jar包"正是指的这个...

    jdbc针对不同数据库的连接方式demo.rar

    2. 连接URL:格式为"jdbc:oracle:thin:@[hostname]:[port]:[service_name]",例如:"jdbc:oracle:thin:@localhost:1521/XE"。 3. 示例代码: ```java Class.forName("oracle.jdbc.driver.OracleDriver"); Connection...

    oracle各java连接驱动包

    这个JAR文件是Oracle JDBC驱动程序的一个版本,专为Java 6设计。"ojdbc6"这个名字中的"6"代表它支持Java SE 6。11.2.0.1.0是驱动的版本号,表明它对应于Oracle数据库11g Release 2的早期版本。这个驱动包包含了 ...

    oracle的jar包.rar

    例如,一个典型的Oracle JDBC连接字符串可能如下所示: ```java String url = "jdbc:oracle:thin:@//hostname:port/service_name"; ``` 在这个字符串中,`hostname`是Oracle数据库服务器的IP地址或域名,`port`是...

    com.oracle.ojdbc6-11.1.0.7.0

    是Oracle公司发布的JDBC驱动程序的一个特定版本,主要用于Java 6环境。然而,值得注意的是,该版本已经在官方渠道下架,意味着不再提供官方支持和更新,但依然可以在某些场景下使用。 1. **JDBC驱动概述**: JDBC...

    适用SQL Server 2016版本的数据库加载驱动包jdbc

    在IT领域,数据库管理和数据操作是至关重要的环节,而Java作为一种广泛应用的编程语言,与数据库交互时常常依赖于Java Database Connectivity(JDBC)接口。本文将深入探讨如何使用JDBC驱动包来连接SQL Server 2016...

    ojdbc14_src.zip数据库连接包反编译后的源码包

    ojdbc14是Oracle JDBC驱动的一个早期版本,它基于JDBC 3.0规范,适用于Java 1.4环境。 【描述】中的“帮助手懒得朋友们”暗示了这个源码包可能是为了方便开发者理解和调试Oracle数据库连接问题而提供的。通常,JDBC...

    Oracle驱动jar包和sqlserver驱动jar包

    - **classes12.jar**: 这是Oracle 9i版本的JDBC驱动程序,它包含了Oracle JDBC驱动的基本类和接口,使得Java应用程序可以连接到Oracle数据库。然而,由于已经过时,现在更推荐使用更新的驱动版本。 - **ojdbc14....

    oracl_ojdbc6

    ojdbc6.jar是Oracle JDBC驱动的一个特定版本,它支持Java SE 6环境,并包含了对JDBC 4.0规范的实现。这个版本的驱动提供了连接Oracle数据库、执行SQL语句、处理结果集等功能,同时也包含了Oracle特定的特性,如PL/...

    ojdbc14-10.2.0.3.0.zip

    "ojdbc14-10.2.0.3.0.zip"是一个包含Oracle JDBC驱动的压缩文件,其版本号为10.2.0.3.0,这是Oracle 10g Release 2 (10.2)的一部分。在这个压缩包中,主要的文件是"ojdbc14-10.2.0.3.0.jar",它是JDBC驱动的实现。 ...

Global site tag (gtag.js) - Google Analytics