/ sqljdbc4.jarでPreparedStatementおよびCallableStatement用のSQL実行計画をJavaで取得できない - java、sql-server、jdbc

sqljdbc4.jar - Java、sql-server、jdbcを使用してPrepared-およびCallableStatementのJavaでSQL実行計画を取得できません

Microsoft Type 4を最近実装しましたjTDSを支持するJDBCドライバ(Microsoft JDBCドライバ4.2 for SQL Serverのsqljdbc4.jar)。 Javaコード内からCallableオブジェクトとPreparedStatementオブジェクトの両方の推定実行計画と実際の実行計画を取得しようとすると、問題が発生します。 私が見つけられた唯一の手がかりは、 SQL Server上でjdbc PreparedStatementを使用してクエリプランを取得する しかし具体的な答えはまだ提供されていません。 データベースはSQL Server 2008 R2です。 コード例は次のとおりです。

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();
}

たとえ

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

ループ文

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

rs.next()がfalseであるため、機能しません。 この例では、SQLにプレースホルダ文字 "?"が含まれています。これにより、最初に "java.sql.SQLException:パラメータ#1が設定されていません。エラー、これは不要です。実際のクエリプランでも推定クエリプランでも、クエリを実行するのではなく、実行プランを取得します。 プレースホルダを実際の値に置き換えても、それ以上壊れませんが、実行計画は返されません。 SQLプロファイラーをアクティブにすると、実行計画を返す必要があることが示されますが、リンク先の記事に正しく記載されているように、実行計画ではなく実際の結果が返されます。 運転手はおそらく実行計画を捨てるのでしょうか? これを可能にするために設定する必要があるデータベース接続を取得するとき設定する必要がある特定の設定がありますか。 誰かがこれを成功させましたか?

回答:

回答№1は0

SQL Serverは推定実行を返さない準備済みステートメントの実行を計画します。 jTDSは、Java PreparedStatementの単なるStatementに近い実行を行うという奇妙な点があり、SQL Serverは推定実行計画を返します。 MSドライバにはこのような癖がないため、Java PreparedStatementまたはCallableStatementを実行したときに推定実行計画が返されることはありません。 jTDSを使用すると、推定実行計画が返される可能性がありますが、すべてのPreparedStatementについて保証されるわけではありません。