简单JDBC连接数据库 异常!!100分!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单JDBC连接数据库 异常!!100分!相关的知识,希望对你有一定的参考价值。

import java.sql.*;
public class TestJDBC
public static void main(String[] args)throws Exception
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.100:1521:PLSExtProc","scott","tiger");
Statement stmt = conn.createStatement();
ResultSet rs =stmt.executeQuery("select * from employees");
while(rs.next())
System.out.println(rs.getString("DEPARTMENT_ID"));
System.out.println(rs.getInt("DEPARTMENT_ID"));

rs.close();
stmt.close();
conn.close();


上面是程序
错误信息:
Exception in thread "main" java.sql.SQLException: 无法从套接字读取更多的数据
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:207)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1117)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1069)
at oracle.jdbc.driver.T4C8TTIpro.receive(T4C8TTIpro.java:130)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:866)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:267)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:413)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:164)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:34)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:752)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at TestJDBC.main(TestJDBC.java:5)
监听文件配置:
# listener.ora Network Configuration File: D:\oracle\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle)
(PROGRAM = extproc)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)
)

TNSNAMES配置:
# tnsnames.ora Network Configuration File: D:\oracle\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

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

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

不知道出了什么问题 高手帮我看看 查了好久都没查到!
自己瞎试弄出来了.("jdbc:oracle:thin:@192.168.1.100:1521:PLSExtProc","scott","tiger");
1521:后面应该接SERVICE_NAME 而不是SID
马老师口误?JDBC初步第一个视频 32分32秒说 :后面跟我们那个数据库的SID就是对外的提供的那个服务的名字我们叫做尚学堂,还记得吗?
想要分的话 赶紧来说啊 不能给百度.....随便说 说的我心里舒服我就给分...

8i以前是sid,以后就service_name和sid都可以了,而且同过oracle的jdbc的thin协议方式,他根本就不会使用你的tnsnames
sid是启动实例必需的环境变量,service_name你可以通过oracle查询,这两个你都可以试试
你的问题我觉得跟使用这个没关系,你可以考虑换换不同版本的驱动试试
参考技术A TNSNAMES配置:
# tnsnames.ora Network Configuration File: D:\oracle\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

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

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
参考技术B 1521端口后面应该加的是sid啊,我记得我们老师当初上课时讲的就是加sid啊,sid在安装oracle数据库的时候是可以更改的,你是不是把它改成了你的那个SERVICE_NAME 啊?

WebApp(Tomcat-jdbc)池化数据库连接抛出放弃异常

【中文标题】WebApp(Tomcat-jdbc)池化数据库连接抛出放弃异常【英文标题】:WebApp (Tomcat-jdbc) Pooled DB connection throwing abandon exception 【发布时间】:2012-10-19 04:57:45 【问题描述】:

我已经浏览了一段时间,并且在此过程中咬牙切齿,但找不到与我的问题完全匹配的问题。 简而言之,在 60 秒不活动后,我得到了极好的堆栈跟踪(org.apache.tomcat.jdbc.pool.ConnectionPool 放弃),这是几个服务器端线程的正常行为。 我直接使用 Tomcat JDBC 连接池 (org.apache.tomcat.jdbc.pool.DataSource) 堆栈跟踪:

2012 年 10 月 29 日 8:55:50 PM org.apache.tomcat.jdbc.pool.ConnectionPool 放弃 警告:连接已被放弃 PooledConnection[com.mysql.jdbc.JDBC4Connection@1ad2916]:java.lang.Exception 在 org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:967) 在 org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:721) 在 org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:579) 在 org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:174) 在 org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:111) 在 com.getsom.getConnection(DAO.java:1444) 在 com.getsom.PreparedConnection.(PreparedConnection.java:48) 在 com.getsom.Alarms.run(Alarms.java:492)

我的 PoolProperties 配置如下:

    PoolProperties pp = new PoolProperties();

    pp.setUrl( someValidUrl);
    pp.setDriverClassName("com.mysql.jdbc.Driver");
    pp.setUsername( someUser);
    pp.setPassword( somePassword);
    pp.setJmxEnabled( true);
    pp.setTestWhileIdle( true);
    pp.setTestOnBorrow( true);
    pp.setValidationQuery( "SELECT 1");
    pp.setTestOnReturn( false);
    pp.setValidationInterval(30000);
    pp.setTimeBetweenEvictionRunsMillis(30000);
    pp.setMaxActive(100);
    pp.setInitialSize(10);
    pp.setMaxWait(10000);
    pp.setMinEvictableIdleTimeMillis(30000);
    pp.setMinIdle(10);

    pp.setLogAbandoned(true);
    pp.setRemoveAbandoned(true);
    pp.setRemoveAbandonedTimeout(60);
    pp.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
      "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");    

    setPoolProperties(pp);

我希望 setValidationInterval(30000) 能救我,因为 30 秒在连接生命周期中并不多。无论如何,问题是:为了让这种联系永远存在,我缺少什么? 很高兴知道:为什么我在声明连接的函数中超时,尽管它在 30 秒前被调用。

【问题讨论】:

【参考方案1】:

即使我迟到了 1 年多才访问此页面,但我在这里偶然发现,因为我遇到了类似的问题并且也需要解决方案。所以我想我会分享最终对我有用的东西。

就我而言,在找到并阅读了这篇文章后 >>> configuring-jdbc-pool-high-concurrency - 我刚刚在我的池配置中添加了一个这样的拦截器;

"org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"

因此,您执行setJdbcInterceptors(...) 的行(来自您上面发布的代码)现在应该如下所示;

p.setJdbcInterceptors(
            "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
            + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;"
            + "org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer");

解释 - 引用文章,它说;

我们要确保当我们检测到连接仍在使用时,我们重置超时计时器,这样连接就不会被视为放弃。我们通过插入一个拦截器来做到这一点。

每次准备语句或执行查询时,计时器都会重置连接池上的放弃计时器。这样……进行大量查询和更新,不会超时。

请记住,您很可能很久以前就已经解决了这个问题,我仍然希望这可以帮助其他遇到类似问题的人,就像我一样。

干杯!

【讨论】:

这个答案也是我的解决方案!谢谢你们!【参考方案2】:

我可以看到这个帖子很旧,但是我遇到了类似的问题,最终我找到了导致它的原因,所以如果它可以帮助某人,我想分享一下:

我使用了来自 RESTful Web 服务的连接。在服务端处理来自客户端的请求的界面中,我不小心在方法签名中放入了'throws IOException':

@GET
@Path("/databases")
@Produces(MediaType.APPLICATION_JSON)
public String getAllDatabases() throws IOException 

【讨论】:

【参考方案3】:

有一个类似的问题,即tomcat正在关闭JDBC连接,因为它因为事务需要很长时间而被放弃。

通过意识到abandonedidle 是不同的并通过设置:spring.datasource.tomcat.removeAbandonedTimeout: 86400 #seconds 来解决它

【讨论】:

【参考方案4】:

只需在tomcat7 conf/server.xml 或context.xml 中添加以下条目即可,只要您的资源标签存在即可。

jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;
org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer"

【讨论】:

【参考方案5】:

这个问题的答案对我很有帮助。

虽然就我而言,我已经配置了“ResetAbandonedTimer”JDBC 拦截器。

但是,我的查询运行时间超过了我也配置的“removeAbandonedTimeout”。一旦我增加了“removeAbandonedTimeout”,问题就消失了。

【讨论】:

【参考方案6】:

如果您在 tomcat 的 context.xml 中定义数据源,则应添加 ResetAbandonedTimer,如下所示:

jdbcInterceptors="ConnectionState;StatementFinalizer;ResetAbandonedTimer"

设置 ResetAbandonedTimer 后,问题在我的应用程序中得到解决,请求您让我知道 ResetAbandonedTimer 拦截器和 removeAbandoned="true" removeAbandonedTimeout="60" 之间是否有任何关系

【讨论】:

【参考方案7】:

在配置文件中跟踪“removeAbandonedTimeout”。这应该是应用程序中的最大运行查询。否则它将在执行过程中关闭连接

【讨论】:

我有同样的问题,并且已经设置了 removeAbandonedTimeout ,但它没有帮助,不幸的是。 您能解释一下如何在 Tomcat 中“跟踪”该资源属性吗? 警告:这只有在如果您只对连接执行一次查询然后再次关闭它,或者使用 ResetAbandonedTimer 过滤器时才成立。否则批处理操作可能会超时运行。【参考方案8】:

您是否在 Tomcat 网站上看到过与PoolConnection 相关的信息。或许你需要看一下minEvictableIdleTimeMillis的属性@

要回答您的问题,您正在超时,因为您每 30 秒检查一次空闲和放弃连接(请参阅TimeBetweenEvictionRunsMillis),并且由于您将可撤销的空闲超时设置为 30 秒(请参阅minEvictableIdleTimeMillis),然后您结束和你所拥有的一样。您说过您在空闲时收到此异常,我怀疑该异常是关闭空闲连接而不是放弃连接的结果。据我了解,放弃连接用于超时时间超过预期的查询(而不是空闲连接)。

就我个人而言,我不希望连接永远处于活动状态,因为它们会不必要地消耗资源(即与数据库的连接)。我会玩弄我的最大连接数、驱逐运行和空闲时间来优化我自己的需求。我想你可以将这些值设置得足够大,几乎永远存在!这确实取决于你在做什么......

很抱歉,我无法提供更多帮助。

【讨论】:

是的,我已经广泛阅读了这篇文章。我相信这与放弃有关,而不是驱逐。我的假设是 ConnectionPool 会让这些连接保持活跃。 您在执行查询时是否收到错误消息?您的查询运行时间超过 60 秒似乎很奇怪! 不。有问题的线程是空闲的。由于 ConnectionPool 假定连接被放弃,这是问题所在。 如果您遇到“已放弃”而不是“空闲”连接的问题,请尝试设置(为我解决了问题):spring.datasource.tomcat.removeAbandonedTimeout: 86400 #seconds

以上是关于简单JDBC连接数据库 异常!!100分!的主要内容,如果未能解决你的问题,请参考以下文章

与orale数据库机器能够ping通,却一直连接出异常(一下是连接错误代码)...能够解决问题者追加悬赏100!!

JDBC数据库连接池DbUtils框架分页

java jdbc连接异常问题数据库

分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)

用jdbc远程连接mysql,报异常

连接不到JDBC异常排查