J'essaie d'aller sur chaque rangée d'une table dans MySQL à l'aide du ressort et d'une plaque JDBCTemplate. Si je ne me trompe pas, cela devrait être aussi simple que:
JdbcTemplate template = new JdbcTemplate(datasource); template.setFetchSize(1); // template.setFetchSize(Integer.MIN_VALUE) does not work either template.query("SELECT * FROM cdr", new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { System.out.println(rs.getString("src")); } });
3 Réponses :
Si vous soupçonnez que vous obtenez une erreur exceptionnelle en raison de la lecture de la table entière, pourquoi n'essayez-vous pas de fractionnement de votre requête. Utilisez des filtres, la clause limite, etc. P>
Cela ferait que la logique du processus soit beaucoup plus complexe. Je teste maintenant un moyen de faire le streaming via la plaque Spring JDBCTEam. Vous permettra de savoir si cela fonctionne ...
L'instruction donne le pilote JDBC A Le pilote est en fait libre d'appliquer ou d'ignorer l'indice. Certains pilotes l'ignorent, certains pilotes l'appliquent directement, certains pilotes ont besoin de plus de paramètres. Le pilote MySQL JDBC tombe dans la dernière catégorie. Si vous vérifiez le Documentation du pilote MySQL JDBC , vous verrez les informations suivantes (faites défiler environ 2/3 vers le bas jusqu'à ce que l'en-tête Resultats em> strong>): P> Pour activer cette fonctionnalité, vous devez créer une instance d'instruction de la manière suivante: p>
Setfetchsize () code> Javadoc indique déjà:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
J'ai ajouté une solution à base de printemps ici: Stackoverflow.com/Questtions/2095490/...
Voici une solution de printemps basée sur le Réponse fournie par Balusc.
DataSource dataSource = ...; RowCallbackHandler rowHandler = ...; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.query(new StreamingStatementCreator("SELECT * FROM huge_table"), rowHandler);
Vaut la peine de noter que vous devez vous assurer que UseServerprepstmts La propriété de votre chaîne de connexion est définie correctement, c'est-à-dire si par une chance que cela soit défini sur FAUX ^^ ne fonctionnera pas et il mettra en cache le jeu de résultats complets
Il convient de noter qu'avec le printemps 3, la constructeur de jdbctemplate de JDBCtemplate ignore les limites inférieures à 1 et vous devez donc remplacer une fonctionnalité très basique. Yuck.
@ADEWGILMARTIN Après 4.3, devrait fonctionner: à partir de 4.3, les valeurs négatives autres que -1 seront transmises au conducteur, depuis par exemple. MySQL prend en charge un comportement spécial pour INTEGER.MIN_VALUE.
Hey, soin de changer la réponse acceptée. Votre question était sur le printemps et la réponse de @ Scompt.com est plus appropriée. Merci beaucoup.