Nasıl JDBC veri kaynağı düzeyinde Oracle dönen satır sayısını sınırlamak için?

oy
4

Tomcat uygulamasında Oracle veri kaynağı düzeyinde döndürülen satırları sınırlamak için bir yolu var mı?

Öyle görünüyor maxRowsJava kodunda veri kaynağı üzerinde ayarlarsanız kullanılabilir. Koyarak maxRows=2veri kaynağı geçerli değildir.

satırlar döndürülür limiti başka yolu var mı? Bir kod değişikliği olmadan?

Oluştur 26/11/2008 saat 11:59
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
4

Bu yapılandırma düzeyinde kullanılabilir bir şey değildir. : Bunu sen yine ne yapmak istediğinizi yapar tekrar kontrol etmek isteyebilirsiniz setMaxRows için javadoc bkz . Oracle ile hala geri sorgu için her bir satırı çeker gidiyor ve sonra sadece aralığın dışında olanları bırakın. Gerçekten de Oracle ile iyi iş yapmak için rownum kullanmak gerekir ve bu her iki konfigürasyonda yapamaz.

Cevap 26/11/2008 saat 12:21
kaynak kullanıcı

oy
1

* Dikkat: Aşağıdaki kod saf örnek olarak verilmiştir. * Test edilmemiştir Böylece kendinizi ya bilgisayarınıza zarar hatta yüzüne yumruk olabilir.

Eğer SQL sorguları değiştirerek kaçınmak istiyorum ama hala (kod sürdürülebilir kalır demektir) temiz kod sahip olmak istiyorsanız, siz wrapperları kullanılarak çözüm tasarım olabilir. Yani mevcut olanları sarma sınıfların küçük bir dizi kullanarak, onları yine de gerçek DataSource, Connection ve Beyanı ile çalışıyor düşünecek uygulamanın geri kalanı için sorunsuz istediğini elde edebilir vardır.

1 - En uygulama zaten kullandığı bağlı olarak StatementWrapper veya PreparedStatementWrapper sınıfını uygulamak. Bu sınıflar, normal Beyanı veya PreparedStatement örnekleri etrafında sarıcıları. Onlar bu bir SORGULAMA beyanı (Statement.executeQuery () yöntemi) olduğunda hariç tüm işlerini yapan bir temsilci olarak iç deyimi kullanmak kadar basit uygulanmaktadır. Sadece bu kesin bir durumda, sarıcı iki aşağıdaki dizeleri ile sorgu çevreleyen: "(ve ") NEREDE ROWNUM <" + maxRowLimit GELEN * SEÇ". Temel kod sarıcı kodu için aşağıda DataSourceWrapper için nasıl göründüğüne bakın.

ConnectionWrapper prepareStatement içinde createStatement () ve PreparedStatementWrapper içinde StatementWrapper döner () bir bağlantı sarar - 2 bir kez daha sarıcı mal. Bunlar inşaat argümanlar olarak ConnectionWrapper en delegateConnection.createStatement () / prepareStatement () alarak önceden kodlanmış sınıflardır.

3 - Bir DataSourceWrapper ayak tekrarlayın. İşte size basit bir kod örneğidir.

public class DataSourceWrapper implements DataSource
{
    private DataSource mDelegate;

    public DataSourceWrapper( DataSource delegate )
    {
        if( delegate == null ) { throw new NullPointerException( "Delegate cannot be null" );
        mDelegate = delegate;
    }

    public Connection getConnection(String username, String password)
    {
        return new ConnectionWrapper( mDelegate.getConnection( username, password ) );
    }

    public Connection getConnection()
    {
        ... <same as getConnection(String, String)> ...
    }
}

4 - Son olarak, uygulamanızın DataSource olduğu DataSourceWrapper kullanın. Eğer JNDI (AdlandırmaBağlamı) kullanıyorsanız, bu değişiklik önemsiz olmalıdır.

Bütün bu Kodlama Eğer automagicallylar delegating yöntemleri uygulayacak Eclipse veya intellij gibi akıllı IDE kullanıyorsanız, özellikle hızlı ve çok basittir.

Cevap 24/02/2011 saat 16:18
kaynak kullanıcı

oy
1

Soru satır sayısı iade sınırlamak istiyoruz nedeni budur. Bunu yapmak için birçok nedeni olabilir. İlk sadece veritabanı tarafından döndürülen verileri sınırlamak olacaktır. Belirli veriler sadece o zaman ben farklı bir deyimi kullanın veya bir filtre koşulu falan eklersiniz almak istiyorum sanki Bence bu çoğu durumda hiçbir mantıklı. Örneğin size tam olarak almak sıralar halinde ve sadece sen y x satır istediğiniz veritabanını anlattığım gibi hangi verilerin dahil değildir hangi verilerin bilmiyorum Oracle rownum kullanırsanız.
İkinci yaklaşım bellek kullanımını sınırlamak ve JDBC sürücüsünden olsun ResultSet tüm verileri içermez böylece performansını artırmaktır. Sen kullanarak ResultSet tarafından tutun satır sayısını sınırlandırabilir Statement.setFetchSize () . Eğer satır sayısı ötesinde ResultSet imleci taşırsanız JDBC sürücüsü veritabanından eksik verileri alıp bunu alınamadı. (Oracle durumunda veri tabanı ile doğrudan JDBC sürücüsü tarafından erişilen bir ref imleç verileri depolar).

Cevap 28/11/2008 saat 11:05
kaynak kullanıcı

oy
0

Bu bir göz atın bir açıklamayla sayfa bir anda Java uygulama içine çekilir ne kadar sınırlayıcı. Başka sonrası belirttiği gibi, DB hala tüm verileri çeker, bu Java tarafında ağ kullanımını ve hafıza kontrol etmek için daha fazladır.

Cevap 20/02/2009 saat 15:55
kaynak kullanıcı

oy
0

Tamam, olur bir kod değişikliği ardından olmaktır.

Son kullanıcı doesnt geri çok sayıda kayıt çekin ve kullanılamayan bir rapor oluşturmak, böylece senaryo bir anlık raporlama aracı sınırlamaktadır.

Zaten oracle maliyet bazlı kaynak yönetimini kullanın.

Cevap 02/12/2008 saat 09:25
kaynak kullanıcı

oy
0

Eğer sadece tek bir tablo ile ilgili olacak biliyorum, o satır sayısını sınırlamak için nereye açıklamada rownum ile bir görüntü oluşturun. Bu şekilde, satır sayısı DB kontrol edilir ve bir istemci uygulamasından herhangi bir sorgu bir parçası olarak belirtilmesi gerekmez. döndürülen satır sayısını değiştirmek isterseniz, o zaman sorguyu çalıştırmadan önce görünümü yeniden tanımlamak.

Daha dinamik yöntem, bir prosedür geliştirmek ve satır bir dizi geçmek ve prosedür müşteriye bir ref_cursor dönmek zorunda olacaktır. Bu DB üzerinde ayrıştırma sert kaçınmak avantajı var ve performansını artıracak.

Cevap 26/11/2008 saat 21:43
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more