网络适配器无法建立连接 - Oracle 11g

3
我编写了一个servlet程序,想要连接我的Oracle数据库,但是出现了错误。我使用的是Eclipse Helios、Tomcat 6.0.37、Oracle 11g(11.2.0.1.0)和ojdbc6.jar(已添加到Server项目的运行配置中)。我可以通过SQL Plus界面连接数据库,甚至可以从Eclipse的数据库开发视角开始连接。但是当我尝试通过我的servlet连接时,就会出现错误。对于我的servlet,我使用的是端口号9090,而对于数据库则是默认的1521端口。
java.sql.SQLException: The Network Adapter could not establish the connection
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:412)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.android.collegenotificationsystem.RegistrationServlet.doGet(RegistrationServlet.java:43)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:359)
    at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:422)
    at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:672)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:237)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301)
    ... 21 more
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:141)
    at oracle.net.nt.ConnOption.connect(ConnOption.java:123)
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:337)
    ... 26 more

以下是我建立连接的代码:

Class.forName("oracle.jdbc.OracleDriver"); Connection con = (Connection) DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:orcl","用户名","密码");

我尝试执行lsnrctl stat命令,结果如下:

LSNRCTL for 32-bit Windows: Version 11.2.0.1.0 - Production on 03-AUG-2013 16:08
:46

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Produ
ction
Start Date                03-AUG-2013 12:14:19
Uptime                    0 days 3 hr. 54 min. 28 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   C:\app\Owner\product\11.2.0\dbhome_1\network\admin\lis
tener.ora
Listener Log File         c:\app\owner\diag\tnslsnr\Owner-PC\listener\alert\log.
xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "orcl.168.1.56" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB.168.1.56" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully

以下是我的tnsnames.ora文件的内容:

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))


ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl.168.1.56)
    )
  )

非常感谢您的帮助。提前致谢。


1
你能告诉我们在Eclipse中连接到这个数据库实例所使用的连接信息吗?提供连接参数的截图会非常有帮助。 - Prahalad Deshpande
我必须问一个显而易见的问题:Servlet 是否在与 Oracle DB 相同的机器上运行? - Joshua Huber
如果是基于云的,则检查数据库ID。 - Smart Coder
3个回答

13

我曾经有过类似的问题,但是通过一个简单的命令就解决了。

lsnrctl start

网络适配器异常的原因可能是:

  1. 数据库主机名或端口号不正确(或者)
  2. 数据库TNS监听器未启动。TNS监听器可以使用lsnrctl实用程序启动。

尝试使用命令提示符启动监听器:

  1. 单击“开始”,在搜索字段中键入cmd,当cmd显示在选项列表中时,右键单击它并选择“以管理员身份运行”。
  2. 在命令提示符窗口中,键入lsnrctl start(不带引号)并按Enter键。
  3. 键入Exit并按Enter键。

希望能有所帮助。


你看到Ash发布的lsnrctl status的输出了吗? - user330315
3
在 macOS 上怎么办?我得到了 lsnrctl: command not found - Marit

5

首先检查您的监听器是否打开。 进入网络管理器,然后进入本地 -> 服务命名 -> orcl。 然后更改您的主机名并输入您的PC名称。 现在进入监听器,更改主机并输入PC名称。


1
我在互联网上搜索了几乎所有相关内容,但这个解决了我的问题。另外,这个“hostname”必须是计算机名称吗?还是只是一种约定或其他什么东西? - Asim
主机名应该与计算机名称不同。 - KhiLan PaTeL

0
DB Listener挂了,应用程序无法连接到数据库的机会增加了。需要启动Listener来解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接