Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
JDBC sürücüsünü indirin
Bu makalede, Azure SQL Veritabanı'na bağlanmak için SQL Server için Microsoft JDBC Sürücüsü kullanırken karşılaşılan sorunlar açıklanır. Azure SQL Veritabanına bağlanma hakkında daha fazla bilgi için bkz:
Ayrıntılar
Azure SQL Veritabanına bağlanmak için SQLServerDatabaseMetaData.getCatalogs'u çağırmak için ana veritabanına bağlanmalısınız.
Azure SQL Veritabanı, bir kullanıcı veritabanından katalog kümesinin tamamını döndürmeyi desteklemez.
SQLServerDatabaseMetaData.getCatalogs , katalogları almak için sys.databases görünümünü kullanır. Azure SQL Veritabanı'nda SQLServerDatabaseMetaData.getCatalogs davranışını anlamak için sys.databases (Transact-SQL) izinlerinin tartışmasına bakın.
Oturum açma zaman aşımı
Azure SQL veritabanlarına bağlanırken önerilen varsayılan değer loginTimeout 30 saniyedir. Sunucusuz bir örneğe bağlanıyorsanız, 60 saniye veya daha uzun bir loginTimeout süresi kullanmanız önerilir. Sunucusuz örnek boştaysa, ilk bağlantıda uyanmak biraz zaman alabilir. Daha fazla bilgi için loginTimeout öğesini nasıl ayarlayacağınızı görmek için Bağlantı özelliklerini ayarlama bölümüne bakın.
Bağlantılar kesildi
Azure SQL Veritabanına bağlandığınızda, boştaki bağlantılar, herhangi bir işlem yapılmadan geçen bir sürenin ardından bir ağ bileşeni (güvenlik duvarı gibi) tarafından sonlandırılabilir. Bu bağlamda iki tür bekleme durumunda bağlantı vardır.
Bağlantıların herhangi bir sayıda ağ cihazı tarafından bırakılabildiği TCP katmanında boşta.
Azure SQL Ağ Geçidi tarafından boşta kalma durumu, TCP açısından bağlantıyı boşta bırakmayan TCP keepalive iletileri gerçekleşebilir, ancak son 30 dakikada etkin bir sorgu çalıştırılmamış olabilir. Bu senaryoda Ağ Geçidi, TDS bağlantısının 30 dakika içinde boşta olduğunu belirler ve bağlantıyı sonlandırır.
İkinci noktayı ele almak ve Ağ Geçidi'nin boşta bağlantıları sonlandırmasını önlemek için şunları yapabilirsiniz:
Azure SQL veri kaynağınızı yapılandırmak için Yeniden yönlendirmebağlantısı ilkesini kullanın.
Hafif etkinlik aracılığıyla bağlantıları etkin tutun. Bu yöntem önerilmez ve yalnızca başka olası seçenek yoksa kullanılmalıdır.
İlk noktayı ele almak ve boşta bağlantıları bir ağ bileşeni tarafından bırakmaktan kaçınmak için, sürücünün yüklendiği işletim sisteminde aşağıdaki kayıt defteri ayarlarını veya Windows dışı eşdeğerlerini ayarlayın:
Uyarı
SQL Server için Microsoft JDBC Sürücüsünün 10.2 sürümünden başlayarak, sürücü veritabanı bağlantıları sırasında oluşturduğu yuvalarda aşağıdaki canlı tutma değerlerini otomatik olarak ayarlar ve aşağıdaki tabloda tanımlanan işletim sistemi varsayılanlarını geçersiz kılır. Bu otomatik ayar yalnızca yuva etkin tutma seçeneklerini ayarlamayı destekleyen Java sürümlerinde gerçekleştirilir. Linux ve macOS'ta En son Java 8+ güncelleştirmeleri bu ayarı destekler. Windows'ta, Java 17+'nın en son güncelleştirmeleri bu ayarı destekler.
| Kayıt Defteri Ayarı | Önerilen Değer |
|---|---|
| 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 \ TcpMaxDataRetransmissions | 10 |
Kayıt defteri ayarlarının etkin olması için bilgisayarı yeniden başlatın.
KeepAliveTime ve KeepAliveInterval değerleri milisaniye cinsindendir. Bu ayarlar yanıt vermeyen bir bağlantının 10 ile 40 saniye içinde bağlantısının kesilmesine neden olur. Yaşatma paketi gönderildikten sonra yanıt alınmazsa, her saniyede bir olmak üzere en fazla 10 kez yeniden denenir. Bu süre boyunca yanıt alınmazsa istemci tarafı yuvanın bağlantısı kesilir. Ortama bağlı olarak, sunucunun 10 saniyeden uzun süre yanıt vermemesine neden olabilecek bilinen kesintileri (örneğin, sanal makine geçişleri) karşılamak için KeepAliveInterval değerini artırmak isteyebilirsiniz.
Uyarı
TcpMaxDataRetransmissions, Windows Vista veya Windows 2008 ve üzeri sürümlerde denetlenemez.
Bunu bir Azure VM'de yapılandırmak için kayıt defteri anahtarlarını eklemek üzere bir başlangıç görevi oluşturun. Örneğin, hizmet tanımı dosyasına aşağıdaki Başlangıç görevini ekleyin:
<Startup>
<Task commandLine="AddKeepAlive.cmd" executionContext="elevated" taskType="simple">
</Task>
</Startup>
Ardından projenize bir AddKeepAlive.cmd dosyası ekleyin. "Çıkış Dizinine Kopyala" ayarını Her zaman kopyala olarak ayarlayın. Aşağıdaki betik örnek bir AddKeepAlive.cmd dosyasıdır:
if exist keepalive.txt goto done
time /t > keepalive.txt
REM Workaround for JDBC keep alive on Azure SQL
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 TcpMaxDataRetransmissions /t REG_DWORD /d 10 >> keepalive.txt
shutdown /r /t 1
:done
Sunucu adını bağlantı dizesindeki userId'ye ekleyin
SQL Server için Microsoft JDBC Sürücüsünün 4.0 sürümünden önce, bir Azure SQL Veritabanına bağlanmak için bağlantı dizesindeki UserId'ye sunucu adını eklemeniz gerekiyordu. Örneğin, user@servername. SQL Server için Microsoft JDBC Sürücüsünün 4.0 sürümünden başlayarak, bağlantı dizesinde UserId'ye eklemek @servername artık gerekli değildir.
Şifrelemenin kullanılması için hostNameInCertificate ayarının yapılması gerekir
SQL Server için Microsoft JDBC Sürücüsünün 7.2 sürümünden önce, bir Azure SQL Veritabanına bağlanmak için encrypt=true (Bağlantı dizesindeki sunucu adı shortName ise) belirtirseniz hostNameInCertificate belirtmeniz gerekir.domainName, hostNameInCertificate özelliğini *olarak ayarlayın. domainName.). Bu özellik, sürücünün 7.2 sürümünden itibaren isteğe bağlıdır.
Örneğin:
jdbc:sqlserver://abcd.int.mscds.com;databaseName=myDatabase;user=myName;password=<password>;encrypt=true;hostNameInCertificate=*.int.mscds.com;