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
Uyarlamalı tamponlama, sunucu imleçlerinin ek yükü olmadan her tür büyük değerli veriyi almaya yönelik olarak tasarlanmıştır. Uygulamalar, sürücü tarafından desteklenen tüm SQL Server sürümleriyle uyarlamalı arabelleğe alma özelliğini kullanabilir.
Normalde, SQL Server için Microsoft JDBC Sürücüsü bir sorgu yürüttüğünde, sürücü sunucudan tüm sonuçları uygulama belleğine alır. Bu yaklaşım SQL Server'da kaynak tüketimini en aza indirgese de, çok büyük sonuçlar üreten sorgular için JDBC uygulamasında bir OutOfMemoryError oluşturabilir.
Uygulamaların çok büyük sonuçları işlemesine izin vermek için SQL Server için Microsoft JDBC Sürücüsü uyarlamalı arabelleğe alma sağlar. Uyarlamalı arabelleğe alma ile, sürücü, SQL Server’dan deyim yürütme sonuçlarını uygulamanın ihtiyaç duyduğu anda alır, yani hepsini bir kerede değil. Sürücü ayrıca, uygulama artık onlara erişemediğinde sonuçları atar. Uyarlamalı arabelleğin yararlı olabileceği bazı örnekler şunlardır:
Sorgu çok büyük bir sonuç kümesi oluşturur: Uygulama, uygulamanın bellekte depolayandan daha fazla satır üreten bir SELECT deyimi yürütebilir. Önceki sürümlerde uygulamanın OutOfMemoryError'ı önlemek için bir sunucu imleci kullanması gerekiyordu. Uyarlamalı tamponlama, sunucu imlecine gerek kalmadan keyfi büyüklükte bir sonuç kümesi üzerinde sadece ileriye yönelik salt okunur bir geçiş yapma yeteneği sağlar.
Sorgu çok büyükSQLServerResultSetsütunları veyaSQLServerCallableStatementOUT parametre değerleri üretir: Uygulama, uygulama belleğine tamamen sığamayacak kadar büyük tek bir değer (sütun veya OUT parametresi) alabilir. Uyarlamalı arabelleğe alma, istemci uygulamasının getAsciiStream, getBinaryStream veya getCharacterStream yöntemlerini kullanarak bir değeri akış halinde almasını sağlar. Uygulama, değeri akıştan okurken SQL Server'dan alır.
Uyarı
Uyarlamalı arabelleğe alma ile JDBC sürücüsü yalnızca gereken veri miktarını arabelleğe alır. Sürücü, arabelleğin boyutunu denetlemek veya sınırlamak için herhangi bir genel yöntem sağlamaz.
Uyarlamalı arabelleği ayarlama
JDBC sürücüsü sürüm 2.0'dan başlayarak, sürücünün varsayılan davranışı "uyarlamalı"dır. Başka bir deyişle, uygulamanızın uyarlamalı arabelleğe alma davranışını elde etmek için bu davranışı açıkça istemesi gerekmez. Ancak sürüm 1.2 sürümünde arabelleğe alma modu varsayılan olarak "dolu" idi ve uygulamanın uyarlamalı arabelleğe alma modunu açıkça istemesi gerekiyordu.
Bir uygulamanın ifade yürütme işlemine uyarlamalı arabelleğe almayı kullanmasını sağlamanın üç yolu vardır:
Uygulama , responseBuffering bağlantı özelliğini "uyarlamalı" olarak ayarlayabilir. Bağlantı özelliklerini ayarlama hakkında daha fazla bilgi için bkz. Bağlantı özelliklerini ayarlama.
Uygulama, SQLServerDataSource nesnesi aracılığıyla oluşturulan tüm bağlantılar için yanıt arabelleği modunu ayarlamak için SQLServerDataSourcenesnesinin setResponseBuffering yöntemini kullanabilir.
Uygulama, belirli bir deyim nesnesi için yanıt arabelleği modunu ayarlamak için SQLServerStatement sınıfının setResponseBuffering yöntemini kullanabilir.
JDBC Sürücüsü sürüm 1.2 kullanılırken, setResponseBuffering yöntemini kullanmak için deyim nesnesini bir SQLServerStatement sınıfına ataması gereken uygulamalar. Büyük veri okuma örneği ve Saklı yordamlarla büyük verileri okuma örneğindeki kod örnekleri bu eski kullanımı gösterir.
Ancak JDBC sürücü sürümü 2.0 ile uygulamalar, uygulama sınıfı hiyerarşisi hakkında hiçbir varsayımda bulunmadan satıcıya özgü işlevselliğe erişmek için isWrapperFor yöntemini ve unwrap yöntemini kullanabilir. Örnek kod için Büyük veri örneğini güncelleme konusuna bakın.
Uyarlamalı arabelleğe alma ile büyük verileri alma
Get<Type>Stream yöntemleri kullanılarak büyük değerler bir kez okunduğunda ve ResultSet sütunlarına ve CallableStatement OUT parametrelerine SQL Server tarafından döndürülen sırayla erişildiğinde, uyarlamalı arabelleğe alma, sonuçları işlerken uygulama belleği kullanımını en aza indirir. Uyarlamalı arabelleğe alma kullanılırken:
< ve > sınıflarında tanımlanan getTypeStream yöntemleri varsayılan olarak bir kez okunan akışlar döndürür, ancak akışlar uygulama tarafından işaretlenirse sıfırlanabilir. Eğer uygulama akışa
resetyapmak istiyorsa, öncemarkyöntemini bu akışta çağırması gerekir.< ve > sınıflarında tanımlanan getTypeStream yöntemleri, yöntemini çağırmadan
markher zaman akışın başlangıç konumuna yeniden konumlandırılabilir akışları döndürür.
Uygulama adaptif arabelleğe alma kullandığında get<Type>Stream yöntemleriyle edinilen değerler sadece bir kez elde edilebilir. Aynı nesnenin get Type Stream yöntemini çağırdıktan sonra aynı sütunda veya parametrede herhangi bir get<>Type<> yöntemini çağırmaya çalışırsanız, "Verilere erişildi ve bu sütun veya parametre için kullanılamıyor" iletisiyle bir özel durum oluşturulur.
Uyarı
ResultSet işleminin ortasında ResultSet.close() çağrısı, SQL Server için Microsoft JDBC Sürücüsünün kalan tüm paketleri okumasını ve atmasını gerektirir. Sorgu büyük bir veri kümesi döndürdüyse ve özellikle de ağ bağlantısı yavaşsa bu işlem çok zaman alabilir.
Uyarlamalı arabelleğe alma kullanma yönergeleri
Geliştiriciler, uygulama tarafından bellek kullanımını en aza indirmek için şu önemli yönergeleri izlemelidir:
Uygulamanın çok büyük bir sonuç kümesini işlemesine izin vermek için selectMethod=cursor bağlantı dizesi özelliğini kullanmaktan kaçının. Uyarlamalı arabelleğe alma özelliği, çok büyük ve yalnızca ileriye doğru okunabilen salt okunur sonuç kümelerinin, sunucu imleci kullanılmadan uygulamalar tarafından işlenmesine olanak tanır. selectMethod=cursor değerini ayarladığınızda, bu bağlantı tarafından oluşturulan tüm ileriye dönük, salt okunur sonuç kümelerinin etkilendiğini unutmayın. Başka bir deyişle, uygulamanız birkaç satırla kısa sonuç kümelerini düzenli olarak işlerse, her sonuç kümesi için bir sunucu imleci oluşturma, okuma ve kapatma işlemleri, selectMethod'unimleç olarak ayarlanmaması durumundan hem istemci tarafında hem de sunucu tarafında daha fazla kaynak kullanır.
getBlob veya getClob yöntemleri yerine getAsciiStream, getBinaryStream veya getCharacterStream yöntemlerini kullanarak büyük metin veya ikili değerleri akış olarak okuyun. 1.2 sürümünden itibaren SQLServerCallableStatement sınıfı bu amaçla yeni get<Type>Stream yöntemleri sağlar.
Büyük olabilecek değerlere sahip sütunların SELECT deyimindeki sütun listesinde en son yerleştirildiğinden ve < get>TypeStream yöntemlerinin sütunlara seçildikleri sırayla erişmek için kullanıldığından emin olun.
Büyük olabilecek değerlere sahip OUT parametrelerinin SQLServerCallableStatement oluşturmak için kullanılan SQL'deki parametre listesinde en son bildirildiğinden emin olun. Ayrıca, < get>TypeStream yöntemlerinin OUT parametrelerine bildirdikleri sırayla erişmek için kullanıldığından emin olun.
Aynı bağlantıda aynı anda birden fazla deyim yürütmekten kaçının. Önceki deyimin sonuçlarını işlemeden önce başka bir deyimin yürütülmesi, işlenmemiş sonuçların uygulama belleğine arabelleğe alınmasına neden olabilir.
aşağıdakiler gibi bazı durumlarda responseBuffering=adaptive yerine selectMethod=cursor kullanmanın daha yararlı olacağı durumlar vardır:
Uygulamanız, bir kullanıcı girdisinden sonra her satırı okuma gibi salt okunur, ileriye doğru sonuç kümesini yavaş bir şekilde işliyorsa, selectMethod=cursor yerine responseBuffering=adaptive kullanmak, SQL Server tarafından kaynak kullanımını azaltmaya yardımcı olabilir.
Uygulamanız aynı bağlantı üzerinde aynı anda iki veya daha fazla ileriye doğru, salt okunur sonuç kümesini işlerse, responseBuffering=adaptive yerine selectMethod=cursor kullanmak, bu sonuç kümelerini işlerken sürücünün gerektirdiği belleği azaltmaya yardımcı olabilir.
Her iki durumda da sunucu imleçlerini oluşturma, okuma ve kapatma ek yükünü göz önünde bulundurmanız gerekir.
Ayrıca, aşağıdaki liste kaydırılabilir ve yalnızca ileriye doğru güncelleştirilebilir sonuç kümeleri için bazı öneriler sağlar:
Kaydırılabilir sonuç kümeleri için, bir satır bloğu getirilirken sürücü, uyarlamalı arabelleğe alma etkinleştirildiğinde bile SQLServerResultSet nesnesinin getFetchSize yöntemiyle belirtilen satır sayısını her zaman belleğe okur. Kaydırma bir OutOfMemoryError'a neden oluyorsa, sqlServerResultSet nesnesinin setFetchSize yöntemini çağırarak getirilen satır sayısını azaltarak getirme boyutunu daha az sayıda satıra , hatta gerekirse 1 satıra kadar ayarlayabilirsiniz. Bu bir OutOfMemoryError'ı engellemiyorsa, kaydırılabilir sonuç kümelerine çok büyük sütunlar dahil etmekten kaçının.
Yalnızca ileriye doğru güncelleştirilebilir sonuç kümeleri için, bağlantıda uyarlamalı arabelleğe alma etkinleştirildiğinde bile sürücü normalde SQLServerResultSet nesnesinin getFetchSize yöntemi tarafından belirtilen satır sayısını belleğe okur. SQLServerResultSet nesnesinin sonraki yöntemini çağırmak bir OutOfMemoryError ile sonuçlanırsa, sqlServerResultSet nesnesinin setFetchSize yöntemini çağırarak getirilen satır sayısını azaltarak getirme boyutunu, gerekirse 1 satıra kadar bile olsa daha küçük bir satıra ayarlayabilirsiniz. İfade çalıştırılmadan önce SQLServerStatement nesnesinin setResponseBuffering yöntemini "adaptive" parametresiyle çağırarak sürücüyü herhangi bir satırı arabelleğe almamaya da zorlayabilirsiniz. Sonuç kümesi kaydırılabilir olmadığından, uygulama get<Type>Stream yöntemlerinden birini kullanarak büyük bir sütun değerine eriştiğinde, sürücü, uygulamanın okuması ile birlikte değeri, yalnızca ileri yönlü salt okunur sonuç kümelerinde yaptığı gibi, hemen atar.
Ayrıca bakınız
JDBC sürücü ile performansı ve güvenilirliği artırma