Oracle JDBC:用户名/密码无效 (ora-01017)

Posted

技术标签:

【中文标题】Oracle JDBC:用户名/密码无效 (ora-01017)【英文标题】:Oracle JDBC : invalid username/password (ora-01017) 【发布时间】:2012-01-16 03:21:41 【问题描述】:

我在 jdbc 连接到 oracle 数据库服务器时遇到了一个奇怪的问题。

我们在 tomcat 服务器上运行应用程序。这些应用程序使用 oracle 数据库。所有应用程序都使用相同的凭据。

应用程序一整天都运行良好。晚上没有活动。早上,当应用程序尝试将自己重新连接到数据库时,我们会收到一些(2 或 3)ORA-01017(无效的用户名/密码)错误。

然后重新连接,应用程序将正常运行。

这可以工作几天(大约 5 天),然后是一个或多个应用程序块!所有重新连接尝试均失败。

我们跟踪了网络通信,发现如果连接失败,ORA-01017 NO CREDENTIALS where sent。

当然没有人在晚上接触系统。

一种解决方法的尝试是,我们每天早上 6 点重新启动 tomcat 服务器以清理每个连接缓存或池。它没有帮助。

怎么了?有什么想法吗?

完全阻塞出现的持续 5 天间隔(每天重述)对我来说看起来很奇怪。

配置

Database Oracle 10.2,JDBC Driver 11.2 thin,tomcat 6.0.24,JDK 6,操作系统是 windows,部分应用是 Avaya Voice Portal 5.0 的 Dialogs。

我们自己的(非 VP)应用程序使用简单的连接(无池)。


系统最初安装在 Windows 2003 服务器上,apserver 和 tomcat 服务器之间有一个 WAN。

系统现在迁移到数据库服务器附近的 linux (CentOS) 服务器上并且工作正常。不再有 ORA-01017。

【问题讨论】:

凭据是否与 LDAP 帐户相关联,如果是,该帐户是否对允许登录的时间有限制(例如,导致通宵问题)? 试着想想你在哪里持有凭证,晚上还会发生什么,是否有任何资源用于备份或其他什么? @normalocity :在本地配置文件中配置的简单数据库用户。没有 LDAP。 @A.B.Cade :凭据存储在本地文件中。我的信息是系统 24/7 全天候运行。 我见过这种问题,因为当数据库关闭以进行夜间备份时,应用服务器连接池无法很好地释放资源。解决方法是在备份之前停止应用服务器并在备份之后再次启动它。你确定数据库不是一夜之间关闭的吗? 【参考方案1】:

对我来说,OracleDriver 的不兼容版本导致了这个问题您的应用程序应该手动注册 oracle 驱动程序(我需要使用的 jar 正在做)或者 agter java 6 ojdbc.jar 应该在您的应用程序的类路径中。因此,适用于您的 oracle 安装的 google 兼容驱动程序版本,或者在您的 pom 文件中声明它(使用需要的插件将其放入生成的 jar 中)并从代码中手动引用它,或者将 ojdbc.jar 放在您的 jar 可以看到它的地方有用的链接:

关于连接oracle db:https://www.codejava.net/java-se/jdbc/connect-to-oracle-database-via-jdbc

关于java类路径:https://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

【讨论】:

【参考方案2】:

我会检查 Oracle 侦听器和跟踪日志。正如 Aaron Digulla 所说,这听起来确实像是资源枯竭。

【讨论】:

【参考方案3】:

奇怪。一些想法:

    将用户名和密码记录几天,以确保它们正确无误。代码中的某些错误可能会覆盖您不期望的值。

    考虑将 JNDI 与 Tomcat 提供的连接池一起使用。 DBCP 有一些非常高级的选项来检查连接是否仍然存在以及如何重新连接它。之后,您不应再在日志中看到任何与连接相关的问题。这也将提高安全性,因为不再需要任何应用程序知道数据库密码。

    这可能是资源泄漏的问题(如果应用从不返回连接,就会发生这种情况),但我预计会出现不同的错误消息。

    某些数据库(DB2、H2)允许创建视图,使来自其他数据库的远程表像本地表一样可见。不确定 Oracle 是否支持,如果支持,则可能是此远程表的用户名/密码错误。

还要考虑这篇博文中的要点:Oracle ORA-01017 tips

乍一看,帖子中的任何内容都不会引起您的问题,但可能是某些脚本正在操纵tnsnames.ora(例如分发新副本)。

或者 DBA 在每日备份期间禁用了所有用户。

【讨论】:

感谢您的回答。我会看看你的一些建议。一点:我们正在使用瘦驱动程序。这意味着没有使用 tnsname.ora。看来我在原始帖子中遗漏了这一点。 因为错误不再发生(从windows服务器切换到centos系统(可能只是巧合))并且因为有用的建议我会设置这个回答。

以上是关于Oracle JDBC:用户名/密码无效 (ora-01017)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 9i:ORA-01017:用户名/密码无效;登录被拒绝

Oracle.ManagedDataAccess 和 ORA-01017:用户名/密码无效;登录被拒绝

Sqldeveloper 无法连接 Oracle 数据库(ORA-01017,用户名/密码无效;登录被拒绝)

ORA-01017: 使用 ODP.NET 托管驱动程序连接到 9i oracle 数据库时用户名/密码无效

oracle 数据库 显示新建数据库连接失败 错误原因ora-01017:用户名 口令无效 登陆被拒绝

了解神秘的 Oracle JDBC 错误 - ORA-00911:无效字符