Oracle JDBC 没响应,是不是BUG?

在Java 中执行下面SQL语句没有响应,DEBUG 无法跟踪代码,但此语句在SQL DEVELOPER 执行没问题,在Java代码中执行其他 SQL 语句基本也没问题。

[code="sql"]insert into T1 (ID, VALUE) select ID, VALUE from T2[/code]

[code="java"]import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import oracle.jdbc.driver.OracleDriver;

public class TestOracleUtil {

public static void main(String[] args) throws SQLException {
    String sql = "insert into T1 (ID, VALUE) select ID, VALUE from T2";
    update(getConnection(), sql);
}

public static Connection getConnection() {
    new OracleDriver();
    String serverName = "192.168.1.3";
    String portNumber = "1521";
    String sid = "ORCL";
    String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":"
            + sid;
    String username = "test";
    String password = "test";
    try {
        Connection conn = DriverManager.getConnection(url, username,
                password);
        return conn;
    } catch (SQLException e) {
        e.printStackTrace();
        return null;
    }
}

static void update(Connection conn, String sql) throws SQLException{
    Statement smt = conn.createStatement();
    smt.executeUpdate(sql);
}

}[/code]

piaoshen1
piaoshen1 原因找到了,是另外一个会话所住要操作的Oracle 表。
6 年多之前 回复

5个回答

如果数据库连接没有报错的话,试试先关闭取消自动提交,[code="java"]conn.setAutoCommit(false) ; [/code],在最后手动提交,[code="java"]conn.commit();[/code]

piaoshen1
piaoshen1 要操作的表被另外一个会话锁住了,那边提交后这边就成功。这个答案比较接近。
6 年多之前 回复

问题可能出在Connection没有提交到数据库,而且你DriverManager 也没有初始化啊~
一般用Class.formane("oracle.jdbc.driver.OracleDriver")

piaoshen1
piaoshen1 这里 new OracleDriver(); 跟 Class.forName(“”) 的作用是一样的,让ClassLoader 找到找到该类。
6 年多之前 回复

[code="java"]try {
Class.forName(sqldriver);
c = DriverManager.getConnection(connURL);
return c;
} catch (Exception e) {
e.printStackTrace();
if (c != null)
try {
c.close();
} catch (SQLException e1) {
}
}
return c;
}

public void closeConnection(Connection c, Statement s, ResultSet r) {
    try {
        if (r != null)
            r.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        if (s != null)
            s.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        if (c != null)
            c.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}[/code]

Class.forName() 没有

piaoshen1
piaoshen1 这里 new OracleDriver(); 跟 Class.forName(“”) 的作用是一样的,让ClassLoader 找到找到该类。
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问