Java Oracle 本地主机连接错误 (ORA-12505)
Posted
技术标签:
【中文标题】Java Oracle 本地主机连接错误 (ORA-12505)【英文标题】:Java Oracle localhost connection error (ORA-12505) 【发布时间】:2011-07-24 08:18:03 【问题描述】:我目前正在尝试连接到我当前计算机上的数据库。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Main
public static void main(String[] argv) throws Exception
Connection connection = null;
try
// Load the JDBC driver
String driverName = "oracle.jdbc.driver.OracleDriver";
Class.forName(driverName);
// Create a connection to the database
String serverName = "localhost";
String portNumber = "1521";
String sid = "xe";
String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
String username = "scott";
String password = "tiger";
connection = DriverManager.getConnection(url, username, password);
System.out.println("Success");
catch (ClassNotFoundException e)
System.out.println("Class Not Found Error");
我不断收到此错误,我不知道为什么...
Exception in thread "main" java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
The Connection descriptor used by the client was:
localhost:1521:xe
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:110)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:171)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:496)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:465)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at Main.main(Main.java:21)
在我的服务器中,我使用了命令(以 sys 身份登录) SQL> 从 v$thread 中选择实例; (它返回) 实例--> xe
我做错了什么?
谢谢!
附:我也试过 127.0.0.1 而不是 localhost
【问题讨论】:
lsnrctl status
与拥有数据库的用户一起运行时会显示什么?
要么是你的连接字符串,要么是数据库配置文件。
您使用的是 Oracle Express Edition (XE) 还是 Standard/Enterprise 版?
@Vineet:SID xe
表明他正在使用 Express Edition。
@Luke,没必要。他正在运行一个示例,按照他之前的问题,所以xe
SID 可能来自他复制的示例。
【参考方案1】:
检查<ORACLE_HOME>\admin\NETWORK
目录下的listener.ora文件是否有如下值:
XE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
【讨论】:
我没有,但我有LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE)) (ADDRESS = (PROTOCOL = TCP)(HOST = LENOVO-E04EFE5E)(PORT = 1522)) ) ) DEFAULT_SERVICE_LISTENER = (XE)
谢谢你,我的端口是 1522 而不是 1521 有问题,现在它可以工作了。谢谢!
@k9b 这里也一样!那有什么办法呢?
看来我的端口已关闭(是 1522 而不是 1521)@Satej - 问题很老,抱歉记不清了【参考方案2】:
而不是 字符串 url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
使用这个:
String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + "/" + sid;
【讨论】:
【参考方案3】:将xe替换成安装时设置的数据库名,一定会成功
如果您忘记了 dbname,可以从 oracle 目录中的文件 tnsnames.ora 中检索它
【讨论】:
【参考方案4】:我在连接到 oracle rac 时遇到了同样的问题。我将网址从port:servicename
更改为port/servicename
,它对我有用。
【讨论】:
【参考方案5】:我猜 TNS 监听器已经启动,但是数据库实例在监听器启动之前启动了。
当数据库实例启动时,它会向 TNS 监听器注册自己。但是,如果没有要注册的侦听器,则无法执行此操作。当监听器启动时,它不会检查它所知道的实例是否已经启动。
我可以提供一个演示。我在 Windows 7 上使用 Oracle 11g XE Beta。最初,OracleServiceXE 服务正在运行,但 OracleXETNSListener 服务未运行。
我运行了您的数据库连接代码,但出现以下错误:
线程“main”java.sql.SQLRecoverableException 中的异常:IO 错误:网络适配器无法建立连接
如果您收到 ORA-12505 错误,那么显然您的 TNS 侦听器正在运行。
然后我启动了 TNS 监听器并重新运行了您的数据库连接代码。这次我得到了以下输出:(我已经重命名了你的类并更改了其中的用户名和密码,但除此之外,其中的代码相同):
C:\Users\Luke\stuff>java DbConnTest 线程“主”java.sql.SQLException 中的异常:侦听器拒绝连接并出现以下错误: ORA-12505, TNS: 监听器当前不知道连接描述符中给出的 SID [堆栈跟踪剪断](此错误与您的错误不同:我没有在其中找到 The Connection descriptor used by the client was:
部分。我不是 100% 确定原因。)
在上述情况下,修复方法是以SYS
连接到SQL*Plus 并运行ALTER SYSTEM REGISTER
。这会将实例注册到侦听器:
这样做之后,我就可以连接到数据库了:
C:\Users\Luke\stuff>java DbConnTest 成功【讨论】:
以上是关于Java Oracle 本地主机连接错误 (ORA-12505)的主要内容,如果未能解决你的问题,请参考以下文章