/ / Impossible d'obtenir le plan d'exécution SQL en Java pour Prepared- et CallableStatement avec sqljdbc4.jar - java, sql-server, jdbc

Impossible d'obtenir le plan d'exécution SQL en Java pour Prepared- et CallableStatement avec sqljdbc4.jar - java, sql-server, jdbc

Nous avons récemment implémenté Microsoft Type 4Pilote JDBC (sqljdbc4.jar du pilote Microsoft JDBC 4.2 pour SQL Server) en faveur de jTDS. Nous avons maintenant des problèmes lorsque nous essayons de récupérer des plans d'exécution estimés et réels pour les objets Callable et PreparedStatement à partir de notre code Java. La seule piste que j'ai pu localiser est: Obtenir le plan de requête à l'aide de jdbc PreparedStatement sur un serveur SQL mais aucune réponse concrète n'a encore été fournie. La base de données est SQL Server 2008R2. Exemple de code est:

Connection cn          = null;
PreparedStatement stmt = null;
Statement execplan_stmt = null;
ResultSet rs           = null;
try
{
cn = getConnection();

execplan_stmt = cn.createStatement();
execplan_stmt.executeUpdate("SET SHOWPLAN_XML ON");
stmt = cn.prepareStatement("SELECT value FROM cfg_system_properties WHERE
property = ?");
stmt.execute();
rs = stmt.getResultSet();
while(rs != null && rs.next())
{
Object obj = rs.getObject(1);
System.out.println("Query plan {} " + obj);
}
execplan_stmt.execute("SET SHOWPLAN_XML OFF");

}
catch (SQLException e)
{
e.printStackTrace();
}

Même en remplaçant le

while(rs != null && rs.next())

déclaration de boucle avec

if(rs.next())
{
String exec_plan = rs.getString(1);
}

ne fonctionne pas car rs.next () est false. Dans cet exemple, SQL contient un caractère de substitution "?", Qui provoque d'abord une "java.sql.SQLException: le paramètre n ° 1 n'a pas été défini." erreur, qui est indésirable. Je ne veux pas exécuter la requête, je veux obtenir le plan d'exécution, que ce soit le plan de requête réel ou estimé. Le remplacement de l’espace réservé par une valeur réelle ne le rompt plus, mais aucun plan d’exécution n’est renvoyé. L'activation du profileur SQL indique qu'un plan d'exécution doit être renvoyé, mais si l'article lié indique correctement, il apparaît que le résultat réel est renvoyé et non le plan d'exécution. Le conducteur est-il peut-être en train de jeter le plan d'exécution? Est-ce que des configurations spécifiques doivent être définies lors de l'obtention de la connexion à la base de données pour pouvoir le faire? Quelqu'un at-il réussi à faire cela?

Réponses:

0 pour la réponse № 1

SQL Server ne renvoie pas l'exécution estiméeplans pour l'exécution des déclarations préparées. jTDS a un côté bizarre avec l’exécution de Java PreparedStatement, qui ressemble plutôt à une simple instruction, obligeant SQL Server à renvoyer un plan d’exécution estimé. Le pilote MS n'a pas cette particularité et, par conséquent, aucun plan d'exécution estimé n'est renvoyé lors de l'exécution d'un Java Prepared- ou CallableStatement. Lorsque jTDS est utilisé, le plan d’exécution estimé peut être renvoyé, mais il n’est pas garanti pour tous les PreparedStatement.