【问题标题】:Apache DBCP and Oracle Transparent Application continuityApache DBCP 和 Oracle 透明应用程序连续性
【发布时间】:2022-10-18 04:51:12
【问题描述】:

当我们的 Oracle RAC 的一个节点出现故障时,我们有一个较旧的应用程序无法进行故障转移。它似乎使用了旧版本的 org.apache.commons.dbcp.BasicDataSource。当我使用 Oracle 的 UCP 时,我可以完成这项工作,但是当我使用 apache 版本时,只要我关闭它所连接的 RAC 的节点,应用程序就会死掉。我是否遗漏了什么或者它不适用于 Apache DBCP?谢谢

这是我的代码。

import org.apache.commons.dbcp.BasicDataSource;

import java.io.PrintStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class BasicDB{



    final static String DB_URL ="jdbc:oracle:thin:user/password@pdb_tac";
    final static String driverClassName = "oracle.jdbc.replay.OracleDataSourceImpl";

    private void pressAnyKeyToContinue()
    {
        System.out.print("Press any key to continue...");
        try { System.in.read(); }
        catch(Exception e) { e.printStackTrace(); }
    }
    public String getInstanceName(Connection conn) throws SQLException {
        PreparedStatement pstmt = conn.prepareStatement("select instance_name from v$instance");
        String r = new String();

        for(ResultSet result = pstmt.executeQuery(); result.next(); r = result.getString("instance_name")) {
        }

        pstmt.close();
        return r;
    }



    private void doTx(Connection c, int numValue) throws SQLException {
        String updsql = "UPDATE test SET v=UPPER(v) WHERE id=?";
        PreparedStatement pstmt = null;
        pstmt = c.prepareStatement(updsql);
        c.setAutoCommit(false);

        for(int i = 0; i < numValue; ++i) {
            pstmt.setInt(1, i);
            pstmt.executeUpdate();
        }

        c.commit();
        pstmt.close();
    }

    public static void main(String[] args) throws SQLException {
        Connection conn = null;
        int numValue = 5000;
;

        try {

            BasicDataSource bods = new BasicDataSource();
            bods.setUrl(DB_URL);
            bods.setDriverClassName(driverClassName);
            bods.setDefaultAutoCommit(false);
            BasicDB self = new BasicDB();
            conn = bods.getConnection();
            String var10001 = self.getInstanceName(conn);
            var10000.println("Instance Name = " + var10001);
            System.out.println("Performing transactions");
            self.pressAnyKeyToContinue();
            self.doTx(conn, numValue);
            var10001 = self.getInstanceName(conn);
            var10000.println("Instance Name = " + var10001);

        } catch (Exception var8) {
            var8.printStackTrace();
        }

    }
}

【问题讨论】:

  • 这是我尝试运行此代码时遇到的错误。 BasicDB - 发生 SQLException:无法为连接 URL 'jdbc:oracle:thin:@pdb_tac' 创建类 'oracle.jdbc.replay.OracleDataSourceImpl' 的 JDBC 驱动程序
  • 看来我正在使用 DataDriver 类名所在的数据源。此外,基本数据源也无法完成我想要完成的任务。需要查看 DataSource 和 poolable 连接工厂。一旦我确定这一点,将发布更多。
  • 好的,这就是我现在的位置。看来我可以克服无法创建 JDBC 驱动程序类错误,但现在我遇到了这个问题。

标签: java oracle apache-commons-dbcp


【解决方案1】:

好的,所以它与使用 DataSource 而不是 DataDriver 类有关。我遇到了另一个错误,因此将为此创建一个新问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2016-02-25
    • 1970-01-01
    • 2021-08-22
    • 2019-10-20
    • 2013-01-06
    • 2015-11-17
    相关资源
    最近更新 更多