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

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
分享到:
评论
53 楼 cuisuqiang 2013-01-17  
wf_chn 写道
没看懂,既然说是JNDI管理,找JNDI要不就行了,干嘛要还要去classforname,new driver etc

JNDI也需要底层驱动才能访问数据库!这样写只是为了示例!
52 楼 wf_chn 2013-01-17  
没看懂,既然说是JNDI管理,找JNDI要不就行了,干嘛要还要去classforname,new driver etc
51 楼 cuisuqiang 2013-01-17  
ironsabre 写道
medbricom 写道
tomcat jndi默认使用的是dbcp连接池 dbcp强行关闭连接或数据库重启无法reconnect(重连),这是dbcp的一个bug,当dbcp强行关闭连接或数据库重启,需要重启服务才行


你说的这个问题我遇到过。

解决方案?
50 楼 ironsabre 2013-01-17  
medbricom 写道
tomcat jndi默认使用的是dbcp连接池 dbcp强行关闭连接或数据库重启无法reconnect(重连),这是dbcp的一个bug,当dbcp强行关闭连接或数据库重启,需要重启服务才行


你说的这个问题我遇到过。
49 楼 cuisuqiang 2013-01-17  
hehuabing 写道
唉,以为是什么天大的BUG个~~!被标头忽悠了。

那是因为你没有遇到这样的问题!许多时候我们不都是因为一个自己为然的小问题纠结几天么!
48 楼 hehuabing 2013-01-17  
唉,以为是什么天大的BUG个~~!被标头忽悠了。
47 楼 cuisuqiang 2013-01-16  
medbricom 写道
tomcat jndi默认使用的是dbcp连接池 dbcp强行关闭连接或数据库重启无法reconnect(重连),这是dbcp的一个bug,当dbcp强行关闭连接或数据库重启,需要重启服务才行

我在现场遇到的情况是,Tomcat下配置了JNDI,当远程只有端口开启没有服务时能力时,Tomcat启动挂起!
46 楼 medbricom 2013-01-16  
tomcat jndi默认使用的是dbcp连接池 dbcp强行关闭连接或数据库重启无法reconnect(重连),这是dbcp的一个bug,当dbcp强行关闭连接或数据库重启,需要重启服务才行
45 楼 cuisuqiang 2013-01-16  
tianzizhi 写道
cuisuqiang 写道
tianzizhi 写道
oracle.net.READ_TIMEOUT 设置一下就行了

29楼已经说过了


看都没仔细看,前面说过了的我还会说么?
1.properties.put("oracle.jdbc.ReadTimeout", "10000");   
2.properties.put("oracle.net.CONNECT_TIMEOUT", "10000");  
仔细看一下一样么,这个oracle.jdbc.ReadTimeout是无效的,我说的是oracle.net.READ_TIMEOUT,这个参数是驱动底层socket用到的,设置了这个,不管是登陆或sql执行超时了都是报read_timout错误


谢谢,经测试,无效果
44 楼 tianzizhi 2013-01-16  
cuisuqiang 写道
tianzizhi 写道
oracle.net.READ_TIMEOUT 设置一下就行了

29楼已经说过了


看都没仔细看,前面说过了的我还会说么?
1.properties.put("oracle.jdbc.ReadTimeout", "10000");   
2.properties.put("oracle.net.CONNECT_TIMEOUT", "10000");  
仔细看一下一样么,这个oracle.jdbc.ReadTimeout是无效的,我说的是oracle.net.READ_TIMEOUT,这个参数是驱动底层socket用到的,设置了这个,不管是登陆或sql执行超时了都是报read_timout错误

43 楼 rensanning 2013-01-16  
cuisuqiang 写道
rensanning 写道
properties.put("oracle.jdbc.ReadTimeout", "10000"); 
properties.put("oracle.net.CONNECT_TIMEOUT", "10000"); 

经测试,无效果!

再设置一下SQLNET.EXPIRE_TIME试试吧(ORACLE_HOME/network/admin/sqlnet.ora)
42 楼 rensanning 2013-01-16  
tianzizhi 写道
oracle.net.READ_TIMEOUT 设置一下就行了

这个参数是针对Firewall的。
41 楼 cuisuqiang 2013-01-16  
MyJavaProject 写道
估计是数据库那端有问题,

魔力猫咪 已经说过了
40 楼 MyJavaProject 2013-01-16  
估计是数据库那端有问题,
39 楼 cuisuqiang 2013-01-16  
lvwenwen 写道
oracle连接数限制问题

这不是我要说的问题
38 楼 cuisuqiang 2013-01-16  
tianzizhi 写道
oracle.net.READ_TIMEOUT 设置一下就行了

29楼已经说过了
37 楼 tianzizhi 2013-01-15  
oracle.net.READ_TIMEOUT 设置一下就行了
36 楼 lvwenwen 2013-01-15  
oracle连接数限制问题
35 楼 cuisuqiang 2013-01-15  
大家都在说本人写法有问题,我知道的连接方式有这么几种。1:class.forName。2:使用OracleDriver。3:使用连接池。4:使用JNDI。有兴趣不妨试试这几种方法,看看到底是不是写法问题!其实说白了,都是调用了Oracle提供的驱动才能访问数据库,而我说的正是驱动实现的问题!如果大家实在有兴趣,到Oracle官方,http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html有一个 demo.zip ,下载下来看看他们怎么写的!不过我觉得实在没必要。
34 楼 cuisuqiang 2013-01-15  
huaye2007 写道
http://blog.csdn.net/downloadsunlight2009/article/details/7579058
在jdbc的标准接口中,有DriverManager.setLoginTimeout方法,用来设置建立数据库连接的超时.我在对sql   server进行过测试,该方法是能够生效的.但是如果对于oracle(8i,9i),该方法没有效果.查阅oracle的官方文档,结果竟然是 "Oracle   JDBC   does   not   support   login   timeouts.   Calling   the   static   DriverManager.setLoginTimeout()   method   will   have   no   effect ",没有想到oralce   jdbc   driver竟然没有实现这个功能,

经过反编译,确实没有找到关于超时的处理!

相关推荐

    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,如果仍然使用这些版本,可以...

    Oracle11 的ojdbc 去除了bug

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

    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。亲测

    连接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...

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

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

    解决oracle 驱动bug: preparestatement ArrayIndexOutOfBounds

    In Oracle Metalink (Oracle's support site - Note ID 736273.1) I found that this is a bug in JDBC adapter (version 10.2.0.0.0 to 11.1.0.7.0) that when you call preparedStatement with more than 7 ...

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

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

    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/...

Global site tag (gtag.js) - Google Analytics