Comment limiter le nombre de lignes retournées par Oracle à la source de données JDBC niveau?
Est-il un moyen de limiter le nombre de lignes retournées à la source de données Oracle niveau dans une application Tomcat?
Il semble maxRows
n'est disponible que si vous la définissez sur la source de données dans le code Java. Mettre maxRows="2"
sur la source de données ne s'applique pas.
Est-il un autre moyen de limiter le nombre de lignes retournées? Sans un changement de code?
OriginalL'auteur Codek | 2008-11-26
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas quelque chose qui est disponible au niveau de la configuration. Vous voulez vérifier qu'il fait ce que vous voulez faire de toute façon: voir la javadoc de setMaxRows. Avec Oracle, il est toujours en cours d'extraire chaque ligne de retour de la requête et ensuite il suffit de déposer ceux en dehors de la gamme. Vous avez vraiment besoin d'utiliser rownum de faire fonctionner correctement avec Oracle et vous ne pouvez pas le faire, soit dans la configuration.
OriginalL'auteur carson
La question est: pourquoi voulez-vous limiter le nombre de lignes retournées. Il pourrait y avoir de nombreuses raisons pour ce faire. La première serait de limiter les données renvoyées par la base de données. À mon avis, cela n'a aucun sens dans la plupart des cas, comme si je tiens à obtenir certaines données seulement alors je voudrais utiliser un autre déclaration ou d'ajouter une condition de filtre ou quelque chose. E. g. si vous utilisez rownum de Oracle vous ne savent pas exactement les données qui sont dans les lignes que vous obtenez et dont les données ne sont pas inclus comme vous venez de le dire à la base de données que vous souhaitez rangée de x à y.
La deuxième approche consiste à limiter l'utilisation de la mémoire et améliorer les performances, de sorte que le jeu de résultats que vous obtenez à partir du pilote JDBC de ne pas inclure toutes les données. Vous pouvez limiter le nombre de lignes par le jeu de résultats à l'aide L'énoncé.setFetchSize(). Si vous déplacez le curseur dans le jeu de résultats au-delà du nombre de lignes récupérées le pilote JDBC récupérer les données manquantes à partir de la base de données. (Dans le cas d'Oracle la base de données enregistre les données dans un ref cursor qui est directement accessible par le pilote JDBC).
OriginalL'auteur reallyinsane
Si vous voulez éviter de modifier vos requêtes SQL, mais que vous souhaitez toujours avoir un code propre (ce qui signifie que votre code maintenable), vous pouvez la conception de la solution à l'aide de papiers d'emballage. C'est, en utilisant un petit ensemble de classes d'emballage existantes, vous pouvez réaliser ce que vous voulez de façon transparente pour le reste de l'application qui va encore penser que c'est de travailler avec une réelle source de données, de Connexion et de la Déclaration.
1 - mettre en œuvre une StatementWrapper ou PreparedStatementWrapper classe, en fonction de ce que votre application utilise déjà. Ces classes sont des wrappers autour de Déclaration normale ou PreparedStatement instances. Ils sont mis en œuvre simplement à l'aide de l'intérieure de la déclaration en tant que délégué qui fait tout le travail, sauf lorsque c'est une REQUÊTE de déclaration (déclaration.executeQuery() la méthode). Seulement dans ce cas précis, cette enveloppe qui entoure la requête par les deux chaînes de caractères suivantes : "SELECT * from (" et ") where ROWNUM < "+maxRowLimit. Pour la base de wrapper de code en code, voir à quoi il ressemble pour le DataSourceWrapper ci-dessous.
2 - écrire une plus wrapper : ConnectionWrapper qui encapsule une Connexion qui renvoie StatementWrapper dans createStatement() et PreparedStatementWrapper dans prepareStatement(). Ceux qui sont précédemment codés classes ConnectionWrapper de delegateConnection.createStatement()/prepareStatement() que la construction d'arguments.
3 - répétez l'étape avec un DataSourceWrapper. Voici un exemple de code simple.
4 - Enfin, l'utilisation que DataSourceWrapper que votre application de base de données. Si vous êtes en utilisant JNDI (NamingContext), ce changement devrait être trivial.
De codage tout cela est rapide et très simple, surtout si vous êtes à l'aide de smart IDE comme Eclipse ou IntelliJ qui mettra en œuvre la délégation des méthodes d'auto-magiquement.
OriginalL'auteur Chucky
Si vous savez que vous aurez affaire à une seule table, puis de définir une vue avec rownum dans la déclaration de limiter le nombre de lignes. De cette façon, le nombre de lignes est contrôlée au cours de la DB et n'a pas besoin d'être spécifié en tant que partie d'une requête à partir d'une application cliente. Si vous souhaitez modifier le nombre de lignes retournées, puis redéfinir la vue, avant l'exécution de la requête.
Plus dynamique de la méthode à mettre en place une procédure et passer dans un certain nombre de lignes, et d'avoir la procédure de retour d'un ref_cursor à votre client. Cela aurait l'avantage d'éviter la difficile analyse sur la DB, et augmenter les performances.
OriginalL'auteur
Ok, une modification du code, il faudra ensuite.
Le scénario est de limiter un outil de reporting ad hoc afin que l'utilisateur final ne pas tirer trop de dossiers et de générer un rapport qui est inutilisable.
Nous avons déjà utiliser oracle basé sur les coûts de la gestion des ressources.
OriginalL'auteur Codek
Prendre un coup d'oeil à ce page avec une description de limiter combien est aspiré dans l'Application Java à la fois. Comme un autre post, la DB va encore tirer toutes les données, c'est plus pour le contrôle de l'utilisation du réseau et de la mémoire de la Java côté.
OriginalL'auteur