解决JDBC 连接 SQL Azure 超时问题

原创 2012年04月01日 15:48:01

最近在做一个Azure云项目,前台是Java代码,Java代码里使用JDBC驱动访问SQL Azure。

用了JDBC 连接串后,发现2分钟左右连接就超时timeout,原来在SQL Server上是能正常工作的。

jdbc:sqlserver://XXXX.database.windows.net:1433;database=miap;user=username@XXXX;password=myPassword;encrypt=true;hostNameInCertificate=*.database.windows.net

理论上SQL Azure会在30分钟后把idle connection自动踢掉,如下面文档所记载:

http://msdn.microsoft.com/en-us/library/windowsazure/ee336245.aspx

Maximumallowable durations are subject to change depending on the resource usage.A logged-in session that hasbeen idle for 30 minutes will be terminated automatically. We stronglyrecommend that you use the connection pooling and always close the connectionwhen you are finished using it so that the unused connection will be returnedto the pool.

目前ado.net 连接是符合上述文档的。但是,JDBC连接还需要一些额外设置,如下面的论坛网址中所描述:

http://social.msdn.microsoft.com/Forums/en-US/ssdsgetstarted/thread/69f2de2f-389b-4c4e-9497-471b8094b029/

I rewrote the Java program in C Sharp, and predictably that worksfine and DOES NOT exhibit the connection drop problems.

I used Wireshark to compare the Java and .NET implementations at theTCP level and the problem becomes clear:

TCP Keep-Alivemessages are sent to SQL Azure every 30 seconds from the .NET code, but thereare no such messages from JDBC, hence the JDBC connection times out at betweenabout 61 to 63 seconds.

针对这个问题的解决方案在这里http://msdn.microsoft.com/en-us/library/hh290696(v=SQL.110).aspx


Registry Setting

Recommended Value

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveTime

30000

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveInterval

1000

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpMaxDataRetransmission

10

You must then restart the computer for the registry settings to take effect.

To accomplish this when running in Windows Azure create a startup task to add the registry keys. For example, add the following Startup task to the service definition file:

<Startup>
    <Task commandLine="AddKeepAlive.cmd" executionContext="elevated" taskType="simple">
    </Task>
</Startup>

Then add a AddKeepAlive.cmd file to your project. Set the "Copy to Output Directory" setting to Copy always. The following is a sample AddKeepAlive.cmd file:

if exist keepalive.txt goto done
time /t > keepalive.txt
REM Workaround for JDBC keep alive on SQL Azure
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveTime /t REG_DWORD /d 30000 >> keepalive.txt
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveInterval /t REG_DWORD /d 1000 >> keepalive.txt
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v TcpMaxDataRetransmission /t REG_DWORD /d 10 >> keepalive.txt
shutdown /r /t 1
:done

相关文章推荐

通过Java访问国内Azure服务

随着Azure服务在国内的开展,不少Java用户也开始在国内Azure部署应用。不过,目前有一个问题,是关于证书。国内Azure服务HTTPS端点的证书,是由CNNIC颁发的,而CNNIC作为一个根证...

JDBC连接SQL Server 2008问题

  • 2012年10月31日 10:54
  • 251KB
  • 下载

解决在Azure 部署SharePoint2013 数据服务器拒绝连接和域连接出现的问题

解决在Azure 部署SharePoint2013 数据服务器和域连接出现的问题 问题描述:在Azure上部署了两个服务器,使用的是一个DNS一个网段,由于使用频繁,欠费停机了。 到月自动续费后,打...

JDBC连接Azure MySQL DB

做个笔记。 package test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Re...
  • YYYQYYY
  • YYYQYYY
  • 2017年07月06日 17:32
  • 123

JDBC连接SQL Server 2008 R2时遇到的常见问题集解

昨天下午开始到现在,一直在捣鼓JDBC连接SQL Server 2008 R2,不知道怎么的,即使已经下了一个教程,照着做,还是出了不少问题,不断的百度、谷歌,弄到凌晨两点多就是不见好,今早起来突然“...

mysql之jdbc连接数据库和sql注入的问题

一,概述 可能是自己的记忆力太差了,经常忘记一些很重要的知识点,记得个大概,等要用的时候就去找,结果还找不到。干脆,记博客里,怎么都找的到。这篇博客主要就是关于Jdbc(java database ...
  • bighuan
  • bighuan
  • 2017年03月09日 08:11
  • 470

windows7中SQL Server 2005 JDBC的连接若干问题

一、Window7中SQL Server Management Studio windows集成不能登陆;首先我们应该在SQL Server Management Studio 上右击选择“以管理员身...

jdbc 连接sql server 2005问题

第一次写这种日志,随便写写。 一开始是通过视频学习数据库的编程,视频中使用jdbc-odbc连接,创建数据源之后一直连不上,然后仍在一边,今天发现好蠢。 。。。。。。。 卧槽,下午我才发现原来这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决JDBC 连接 SQL Azure 超时问题
举报原因:
原因补充:

(最多只允许输入30个字)