【问题标题】:Can't connect to oracle database outside container with jdbc无法使用 jdbc 连接到容器外的 oracle 数据库
【发布时间】:2022-12-11 19:45:39
【问题描述】:

我按照 these 的说明使用以下命令为 Oracle Express 数据库创建了一个容器:

docker run -d -e ORACLE_PWD="root" --name testdb -p 5500:5500 -p 8080:8080 -p 1521:1521 container-registry.oracle.com/database/express:21.3.0-xe

什么工作

我设法使用以下命令从容器内访问数据库: docker exec -it testdb sqlplus system/root@//localhost:1521/XE

我还设法使用这些凭据访问 localhost:5500/em 上的 Oracle Enterprise Manager:

  • 用户名:system
  • 密码:root
  • 容器名称:<blank>

什么不起作用

我无法使用 IntelliJ 进行连接,因此无法连接底层的 JDBC 库。我使用以下选项:

对于密码,我再次使用root,JDBC URL如下: jdbc:oracle:thin:@localhost:1521:XE

当我点击 Test connection 时,IntelliJ 尝试连接大约一分钟,然后显示以下错误

【问题讨论】:

    标签: oracle docker jdbc


    【解决方案1】:

    我在我的 MacOS 上做了一个测试

    # fire up the database. Hint, use gvenzl images instead. Much faster! 
    docker run -d -e ORACLE_PWD="root" --name testdb -p 5500:5500  -p 8081:8080 -p 1521:1521 container-registry.oracle.com/database/express:21.3.0-xe
    
    # I have sqlplus installed locally on my MacOS
    echo 'select dummy from dual;' | sqlplus -S system/"root"@localhost/XE
    
    D
    -
    X
    
    echo 'select dummy from dual;' | sqlplus -S system/"root"@localhost:XE
    ERROR:
    ORA-12545: Connect failed because target host or object does not exist
    
    
    SP2-0306: Invalid option.
    
    # so, how is JDBC behaving taking the connect string as argument 
    java -cp .:./ojdbc8-19.6.0.0.jar OracleJDBC "jdbc:oracle:thin:@localhost:1521:XE"
    X
    
    java -cp .:./ojdbc8-19.6.0.0.jar OracleJDBC "jdbc:oracle:thin:@localhost:XE"
    java.sql.SQLRecoverableException: IO Error: Invalid number format for port number
    
    java -cp .:./ojdbc8-19.6.0.0.jar OracleJDBC "jdbc:oracle:thin:@localhost/XE"
    X
    

    笔记。不需要端口,默认为 1521

    cat OracleJDBC.java
    import java.sql.DriverManager;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.ResultSet;
    
    public class OracleJDBC {
        public static void main(String[] argv) {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (ClassNotFoundException e) {
                System.out.println("Where is your Oracle JDBC Driver?");
                e.printStackTrace();
                return;
            }
            Connection connection = null;
            String query = "select dummy from dual";
            try {
                connection = DriverManager.getConnection(argv[0], "system","root");
                Statement stmt = connection.createStatement();
                ResultSet rows = stmt.executeQuery(query);
                while (rows.next()) {
                    System.out.println(rows.getString("dummy"));
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    

    我无法解释为什么会出现错误。可以是您使用的 JDBC 版本吗?我刚刚证明,您的连接应该有效。也就是说,您不应该再使用 SID 构造 (:SID) 进行连接。您将访问根容器,而不是您应该存储数据的位置 - 在可插拔数据库中。快速版带有默认的可插入数据库“XEPDB1”。

    echo 'select name from v$pdbs;' | sqlplus -S system/"root"@localhost/XE
    
    NAME
    ------------------------------
    PDB$SEED
    XEPDB1
    

    这应该是您的连接字符串:

    echo 'select dummy from dual;' | sqlplus -S system/"root"@localhost/XEPDB1
    
    D
    -
    X
    

    从这里您可以创建您的应用程序模式和用户,这样您就不会再使用高级用户“系统”。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多