这是一个比较具体的问题。
我正在一个使用数据库访问框架的 Java 项目中做一些工作,该框架最初设计用于使用 Oracle DB 9i。
为了处理这个项目,我需要在我的 Mac 上运行一个 Oracle DB,运行 OSX Mountain Lion,唯一明显的解决方案是在 VM 中运行它。因此,我从这里下载了 OTN 开发人员日 VM,它附带了一个 Oracle DB 12c 实例。
在经历了各种麻烦之后,我已经设置了我的 Eclipse/Tomcat/Servlets,以便使用我从 Oracle 站点下载的 jdbc7 驱动程序与 12c 数据库通信。一切都按预期工作,并且需要注意的是,Oracle SQL Developer 可以很好地连接到它。
这是我正在使用的连接字符串:jdbc:oracle:thin:@localhost:1521/pdb1
我可以作为在默认可插拔数据库中创建的本地用户登录,或者通过使用连接字符串jdbc:oracle:thin:@localhost:1521:orcl
,我可以作为任何设置的普通用户登录。
现在,诀窍是当我想使用专为与 9i DB 一起使用而设计的 Java DB 访问框架时。我得到错误:ORA-28040: No matching authentication protocol
。
根据我能找到的内容,例如这个Oracle 线程,我的 12c 数据库未配置为允许 9i 样式的身份验证(由于 9i 中的安全漏洞)。所以要解决这个问题,我需要通过访问这个文件来设置我的数据库以允许这样做:
/u01/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora
并添加以下行:
SQLNET.ALLOWED_LOGON_VERSION=(9)
(请注意,我也尝试过(8)
, as well as(12,11,10,9,8,7)
和其他类似的奇怪现象,但我仍然遇到以下情况。我还看到SQLNET_ALLOWED...
了 ,下划线而不是句点,但我认为这是针对较旧的 Oracle DB 版本。)
当我这样做并重新启动 VM 时,我无法再连接到数据库。当我尝试连接时,pdb1
我得到:
An error was encountered performing the requested operation:
IO Error: The Network Adapter could not establish the connection
Vendor code 17002
当我尝试连接时,orcl
我得到:
An error was encountered performing the requested operation:
Listener refused the connection with the following error:
ORA-12528, TNS:listener: all appropriate instances are blocking new connections
Vendor code 12528
当我进入 VM 中的终端并使用 lsnrctl 检查服务状态时(我用谷歌搜索了一下),会发生这种情况:
Services Summary...
Service "orcl" has 1 instance(s).
Instance "orcl", status BLOCKED, has 1 handler(s) for this service...
The command completed successfully
LSNRCTL>
不幸的是,总的来说,我在 Oracle 数据库和数据库管理方面相当轻量级。我宁愿简单地编写代码并让数据库正常工作,但我确实需要让这个数据库访问框架工作,而且我只有 Oracle 12c 的副本,而不是 9i,所以我处于绑定状态。