sql 数据库连接超时

Posted

tags:

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

1.我是用Myeclipse+tomcat 发布web 项目
2.连接的是SQL2005,能够用sa登陆,数据库没问题
3.也在项目里面加载了QL2005Driver驱动,连接数据库的代码没问题
4.用数据源JDBC连也是一样,连接超时。
5.控制栏报的错误是:com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。 java.net.ConnectException: Connection timed out: connect
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.loginWithoutFailover(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at com.newer.struts.dao.BaseDao.getConnection(BaseDao.java:16)
at com.newer.struts.dao.BaseDao.main(BaseDao.java:39)
还有TCP/IP也已开启了,配置也没问题

原因分析:
查询超时一般来说首先要从sql语句和数据表的结构上找原因,优化sql语句和为数据库的查询字段建索引是最常用的办法。
另外,数据库的查询超时设置一般是sqlserver自己维护的(在你没有修改query wait配置前),只有当你的实际查询时间超过估计查询时间的25倍时,才会超时。
而造成超出估计值那么多的原因有两种可能:
一是估计时间不准确;
二是sql语句涉及到大量占用内存的查询(如排序和哈希操作),内存不够,需要排队等待资源造成的。
解决办法:
A.优化语句,创建/使用合适的索引;
B.解决第一个问题的方法,更新要查询表的索引分发统计,保证估计时间的正确性,UPDATE STATISTICS 表名;
C.增加内存
如果想手动设置查询超时,可以使用以下语句:
sp_configure \'show advanced options\', 1 GO RECONFIGURE GO sp_configure \'query wait\', 2147483647 GO RECONFIGURE GO
参考技术A 这肯定还是JDBC的问题了。因为你直接连接是可以的。证明服务端没有问题。
建议找一段简单的连接mssql的代码,传到您的web空间,测试下效果。
参考技术B 看一下是不是端口的问题.

确定TCP/IP有没有启动.

确定TCP端口对不对, 在TUTORIAL和SAMPLE里的都是1433端口, 可是我SQL SERVER的TCP接听端口是2159. 把程序里的1433改成1459就马上可以用了.

设置方法:
打开SQL SERVER CONFIGURATION MANAGER (不记得SQLEXPRESS版本有没有这个了, ENTERPRISE版本的有), 左边窗口扩展SQL SERVER 2005 网络配置, 选择SQLEXPRESS 的协议(你的名字不一定是SQLEXPRESS), 右边窗口中双击TCP/IP, 弹出窗口中顶部TAB点"IP 地址", 看IPA11(或者是IPAll..看不出来是1还是l), 里面"TCP 动态端口"的值就是你的端口.
参考技术C 防火墙的问题。本回答被提问者采纳 参考技术D 应该是配置有问题,检查一下数据库的url,usr,psw 是否都正确。

无法从 Sql Server 2005 获取数据(连接超时异常)

【中文标题】无法从 Sql Server 2005 获取数据(连接超时异常)【英文标题】:Unable to get data from Sql Server 2005 (connection time out exception) 【发布时间】:2012-03-06 11:06:34 【问题描述】:

java.sql.SQLException: 网络错误 IOException: Connection timed out: connect at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:410) at net.sourceforge.jtds.jdbc.ConnectionJDBC3.(ConnectionJDBC3. java:50) 在 net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184) 在 java.sql.DriverManager.getConnection(DriverManager.java:582) 在 java.sql.DriverManager.getConnection(DriverManager.java :185) 在 mahesh.MyFrame.connectToServer(MyFrame.java:50) 在 mahesh.DataCount.main(DataCount.java:18) 原因:java.net.ConnectException:连接超时:在 java.net.PlainSocketImpl 连接。 socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 在 java.net.Socket.connect(Socket.java:519) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 net。 sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:307) 在 net.sourceforge.jtds.jdbc.SharedSocket.(SharedSocket.java:257) 在 net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:第311章……还有6个

谁能帮我摆脱这个异常?

这是我的java代码

**Class.forName("net.sourceforge.jtds.jdbc.Driver");

连接连接 = DriverManager.getConnection("jdbc:jtds:sqlserver://mindmill:1433/employ","mahesh","mahesh");**

【问题讨论】:

尽快以 stakoverflow 格式格式化问题... ***.com/… 我之前在使用 jtds 驱动程序时遇到了一些问题,请问您可以发布您的 JDBC URL 吗?可能你没有正确设置Sql Server实例,关闭了实例或者为Sql Server实例禁用了TCP/IP客户端协议。 我将 jtds.jar 放在我的 netbeans 项目库文件夹中 【参考方案1】:

正如jTDS FAQ 所述,URL 必须采用以下格式

jdbc:jtds:<server_type>://<server>[:<port>][/<database>][;<property>=<value>[;...]]

从你的连接推断:

mindmill 是安装 Sql Server 2005 的 your_computer/server 的名称。 1433 是连接 Sql Server 2005 的(默认)端口。 employ 是数据库名称。 ma​​hesh 是您连接服务器的用户名和密码。

从这里开始,您必须设置其他 sql 连接参数。我会把我的代码发给你:

package edu.jtds.main;

import java.sql.*;

public class SqlServerConnTest 

    Connection conn;

    public void connect() 
        try 
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            String dbName = "TestDB";
            String user = "cajeroUpz";
            String password = "cajero";
            //the name of my SQL SERVER 2005 instance
            String SqlServerInstance = "instance=SQL2005";
            String url = "jdbc:jtds:sqlserver://localhost:1433";
            url = url + "/" + dbName;
            url = url + ";" + SqlServerInstance;
            conn = DriverManager.getConnection(url, user, password);
         catch (Exception e) 
            e.printStackTrace();
        
    

    public Connection getConnection() 
        return this.conn;
    

    public static void main(String[] args) 
        SqlServerConnTest oSqlServerConnTest = new SqlServerConnTest();
        oSqlServerConnTest.connect();
        String sql = "SELECT * FROM TEST_TABLE";
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        try 
            conn = oSqlServerConnTest.getConnection(); 
            stat = conn.createStatement();
            rs = stat.executeQuery(sql);
            while(rs.next()) 
                System.out.println(String.format("%d %s", 
                    rs.getInt(1), rs.getString(2)));
            
            rs.close();
            stat.close();
            conn.close();
         catch (Exception e) 
            e.printStackTrace();
        
    

我的程序的输出:

1 hello world
2 goodbye!

这里的教训:

    从 SQL Server 2005 及更高版本开始,您必须设置实例的名称(如上例)。 在 SQL Server 中,你必须检查你的 TCP/IP 协议是否启用,并且通讯端口是 1433(这最后一个是默认设置的,检查一下就可以了)。您可以使用 SQL Server 2005 配置工具中的 SQL Server 配置管理启用/禁用。

还有什么问题,直接告诉我吧。

编辑:

最好的情况是,如果您已经尝试将您的电脑作为服务器连接,我的意思是您的电脑必须安装 Sql Server 2005,安装 NetBeans 并且项目已经设置并运行(作为概念证明连接数据库)。

即使您之前没有执行此步骤,在尝试连接远程服务器之前,您也应该回答一系列问题:

    您是否检查过您的电脑和主机之间的通信?在您的情况下,提示命令行(开始/运行...键入“cmd”并回车)并输入命令“ping mindmill”,检查服务器的主机名。 您是否在您的 PC 中安装了 Sql Server Management Studio 并连接到您的服务器?你的服务器允许远程连接吗? Help 1 用户是否有足够的权限连接数据库? Help 2

在您之前回答过这些问题之后再告诉我任何问题。

【讨论】:

我应该在我的操作系统中创建任何 DNS。我所做的只是将 jtds.jar 放在我的 netbeans 项目库文件夹中。我的项目方案是从服务器数据库访问一个表,为此我正在遵循上述程序。请建议我我不知道数据库和服务器数据库访问 您运行项目的PC必须与您的服务器连接,您可以在控制台上使用ping命令进行尝试,例如ping 192.168.1.11(从您的服务器替换 ip)。如果服务器响应正常,请尝试将 Sql Server 与 Sql Server Management Studio (Express Edition for Windows here) 连接。另一个连接问题问题已处理here。请问您的操作系统是什么? @mahesh 抱歉,我没有把你的名字放在我的评论中,现在你可以查看你的收件箱了 :) 我收到以下异常::::::::java.sql.SQLException: Network error IOException: Connection timed out: connect

以上是关于sql 数据库连接超时的主要内容,如果未能解决你的问题,请参考以下文章

sqlplusrac连接超时

为啥我的SQL SERVER2005在连接ODBC时会出现连接超时过期呢

用C#连接操作MYSQL时,老是会超时,怎么处理SQL语句执超时啊,连接字符串里好像设置不了。

在 SQL Server 中设置最大连接超时的最佳方法

java应用调用数据库超时,数据库自己sql很正常

无法从 Sql Server 2005 获取数据(连接超时异常)