如何解决从 oracle 11g jdbc 7/14 jdk 1.7 中的读取调用中得到减一?
Posted
技术标签:
【中文标题】如何解决从 oracle 11g jdbc 7/14 jdk 1.7 中的读取调用中得到减一?【英文标题】:how to resolve Got minus one from a read call in oracle 11g jdbc 7/14 jdk 1.7? 【发布时间】:2015-10-20 16:19:40 【问题描述】:我正在使用带有 1.7 的 netbeans 和 jdk 7 updt 9,以下是我的代码。
public class jd
public static void main(String[] args) throws ClassNotFoundException, SQLException
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1158:ORCL","system", "system");
System.out.println("Connection successful");
// Statement s = con.createStatement();
输出是
run:
Exception in thread "main" java.sql.SQLRecoverableException: IO Error: Got minus one from a read call
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:673)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at jd.main(jd.java:22)
Caused by: oracle.net.ns.NetException: Got minus one from a read call
at oracle.net.ns.Packet.receive(Packet.java:314)
at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:153)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:263)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
... 7 more
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
【问题讨论】:
JDBC驱动的版本和你服务器的版本是多少? jdbc 6/14.0/14.01/7.0 oracle 11g 11.0.2 【参考方案1】:oracle.jdbc.driver.OracleDriver
已弃用。用oracle.jdbc.OracleDriver
替换它可能会获得更好的成功
见:http://www.oracle.com/technetwork/database/enterprise-edition/111070-readme-083278.html 和 Difference between Oracle jdbc driver classes?
【讨论】:
没有任何工作,我尝试了所有,它没有使用 db 服务连接,oracle 瘦,使用相同的设置,mysql 连接器驱动程序连接成功,但 oracle sql 11g 不工作。【参考方案2】:我认为错误出在这一行的端口号 1158 中:
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1158:ORCL","system", "system");
通常您使用端口 1521 连接到 Oracle 数据库。尝试将 1158 替换为 1521。
您的数据库可能在端口 1158 上运行企业管理器。这是您访问的 Web 应用程序,通常通过导航到 https://localhost:1158/em。 Oracle 数据库本身通常会监听 1521 端口。
使用 JDBC 时,您需要直接连接到数据库,而不是连接到某些 Web 应用程序。 Oracle JDBC 驱动程序理解它用来与数据库通信的专有二进制协议,但它不理解从企业管理器 Web 应用程序返回的 HTTP。因此,您会收到一个奇怪的网络错误。如果您尝试将 JDBC 驱动程序连接到其他不是 Oracle 数据库的东西,您可能会遇到类似的随机网络错误。
【讨论】:
没有任何工作,我尝试了所有,它没有使用 db 服务连接,oracle 瘦,使用相同的设置,mysql 连接器驱动程序连接成功,但 oracle sql 11g 不工作。 '没有任何效果,我都试过了'。显然你没有,就好像你已经尝试了你与 Oracle 的连接到现在可以工作的一切。那么,当您按照我的建议更改端口号时会发生什么?你得到什么错误信息?您还尝试了什么,每种情况下的结果是什么(请在每种情况下提供完整的错误消息,这些“它不起作用”的含糊不清)。将您的问题编辑为您尝试过的所有内容的详细信息以及每种情况下的结果。【参考方案3】:试试这个代码:
OracleDataSource ods = new OracleDataSource();
ods.setUser(DB_USER));
ods.setPassword(DB_PASSWORD);
ods.setURL(jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=myhost)(PORT=1521)(PROTOCOL=tcp))(CONNECT_DATA=(SERVICE_NAME=myorcldbservicename))));
// New AutoClosable syntax applicable to connection. This syntax will
// close the connection automatically
try (OracleConnection connection = (OracleConnection) (ods.getConnection()))
// Statement and ResultSet are AutoClosable by this syntax
try (Statement statement = connection.createStatement())
try (ResultSet resultSet = statement.executeQuery("select sysdate from dual"))
while (resultSet.next())
System.out.print("Today's Date is: " + resultSet.getString(1));
【讨论】:
【参考方案4】:DriverManager 在尝试获取具有无效 URL 的连接时会引发此错误。确保您的网址有效。 结帐的东西:
-
端口:Oracle db 在 1521 上运行。(注意:不要将自己与 oracle 的 webport 混淆,它可以是 URL 1158 中的任何其他端口)。
数据库名称:从 Oracle Web UI 获取数据库名称:(home->adminIstration->aboutdatabase->settings)
网址格式:
"jdbc:oracle:thin:@localhost:1521:YourDbName"
【讨论】:
以上是关于如何解决从 oracle 11g jdbc 7/14 jdk 1.7 中的读取调用中得到减一?的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE11g:No Dialect mapping for JDBC type: -9解决方案
jdbc连接oracle11g出现ora-12505错误怎么解决?