【发布时间】: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