問題タブ [jtds]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
830 参照

sql - JDBC ドライバー / SQL Server は、ROW_NUMBER() が含まれていると、準備されたステートメントを常に再コンパイルします。

ROW_NUMER() コードを含む準備済みステートメントは、SQL コードが変更されていないにもかかわらず、しばしば再コンパイルされることに気付きました。

(Book Inside Microsoft SQL Server 2008: T-SQL Querying の例):

jTDS JDBC ドライバー (1.2.3) の最新バージョンを使用していますが、SQL Server 2005 と 2008 の両方に問題があることに気付きました。

誰が何が起こっているのか手がかりを持っていますか? コードが変更されていないのに、ステートメントを再コンパイルするのはなぜですか? 私のクエリの 1 つでは、再コンパイルに約 1200 ミリ秒かかります。これは、31 ミリ秒という短い実行時間に比べてかなり長いです。

0 投票する
3 に答える
4303 参照

jdbc - JRuby で jTDS ドライバーを使用して Sybase ASE 12.5.4 を使用する

問題

Sybase ASE 12.5.4データベースに接続して複雑なクエリを実行するために、1日1回jrubyを使用して実行される小さなrubyスクリプトを作成しようとしています。

最終的には、データに対して何らかの処理を行い、新しいデータを MySQL テーブルに挿入して、Rails アプリケーション内で使用するつもりです。

環境

  • jruby v1.4.0
  • Java v1.6.0_15
  • Ubuntu カルミックで

JRuby にインストールされた Gem

  • activerecord-jdbc-adapter (0.9.1)
  • アクティブレコード-2.3.4

Jruby Lib ディレクトリ

  • jtds-1.2.5

クエリ

コードスニペット

これがDBに接続されていることを確認できます。データベーステーブルから10行を選択するだけで問題がありますが。

プロデュース

実行方法の場合:

select_rowsメソッドの場合:

エラーは、結果セットを返すべきではないと述べていますが、使用するメソッド、execute、select_rows などは関係ありません。

クエリに関してもう 1 つ。私の元のクエリはかなり複雑です。変数を宣言し、一時テーブルを削除して一時テーブルを作成し、データを入力して選択します。Squirrel SQL を使用すると、一度実行して結果を得ることができます。DBI を使用すると、1 回の実行でこれを行うことができませんでした。すべてを 1 回だけ実行できるか、それとも分割する必要があるかを知っている人はいますか?

誰でも私に何か助けてもらえますか?jTDS を適切に使用していますか? よろしくお願いします。

0 投票する
8 に答える
3944 参照

java - ストアドプロシージャは、データベースで直接実行する場合と比較して、Javaで実行する場合に30%遅くなります。

私はJava1.6、JTDS 1.2.2(1.2.4を試しただけで役に立たなかった)、SQL Server 2005を使用して、ストアドプロシージャ(パラメーターなし)を実行するためのCallableStatementを作成しています。同じストアドプロシージャを実行しているJavaラッパーがSQLServerManagement Studioを使用するよりも30%遅くなっています。私はMSSQLプロファイラーを実行しましたが、2つのプロセス間のI / Oにほとんど違いがないため、クエリプランのキャッシュに関連しているとは思いません。

ストアドプロシージャは引数をとらず、データを返しません。サーバー側カーソルを使用して、テーブルにデータを入力するために必要な値を計算します。

Javaからストアドプロシージャを呼び出すと30%のオーバーヘッドがどのように追加されるかわかりません。確かに、SQLが送信され、データベースがそれを実行するのはデータベースへのパイプにすぎません。データベースがJavaを提供している可能性があります。別のクエリプランをアプリしますか?

私はMSDNフォーラムとsourceforgeJTDSフォーラムの両方に投稿しました(トピック:「DBで直接よりもJTDSで遅いストアドプロシージャ」)これがなぜ起こるのかについて誰かが何か提案があるかどうか疑問に思いました。

前もって感謝します、

-ジェームズ

(NB恐れることはありません。解決策が見つかったら、他のフォーラムで得た回答をここでまとめます)

Javaコードスニペット:

SQLプロファイラーを実行しましたが、次のことがわかりました。

Javaアプリ:CPU:466,514読み取り:142,478,387書き込み:284,078期間:983,796

SSMS:CPU:466,973読み取り:142,440,401書き込み:280,244期間:769,851

(どちらもプロファイリングの前にDBCC DROPCLEANBUFFERSを実行し、両方とも正しい数の行を生成します)

だから私の結論は、彼らは両方とも同じ読み取りと書き込みを実行するということです、それは彼らがそれをしている方法が違うということです、皆さんはどう思いますか?

クエリプランはクライアントごとに大幅に異なることがわかります(Javaクライアントは、より高速なSQLクライアントにない挿入中にインデックスを更新します。また、結合の実行方法も異なります(ネストされたループとループ)。ストリームの収集、ネストされたループとインデックススキャン、argh!))。これがなぜなのか、私はまだわかりません(私がそれの底に達したときに私は再投稿します)

エピローグ

これを正しく動作させることができませんでした。JavaとMgmtスタジオクライアント間の接続プロパティ(など)を均質化してみarithabortました。ansi_nullsその結果、2つの異なるクライアントは非常に類似したクエリ/実行プランを持っていました(ただし、実際のplan_idは異なります)。JDBCクライアントと管理スタジオの間だけでなく、Microsoft独自のコマンドラインクライアントであるSQLCMDの間でもパフォーマンスが異なることがわかったので、MSDN SQL Serverフォーラムに見つけたものの要約を投稿しました。また、ネットワークトラフィックなどのより急進的なものもチェックしました。また、ニヤリと言うために、ストアドプロシージャを別のストアドプロシージャ内にラップします。

問題はカーソルの実行方法のどこかにあると感じています。それはどういうわけかJavaプロセスの中断を引き起こしていましたが、他に何も実行されていないときに別のクライアントがこの異なるロック/待機動作を引き起こす必要があるのはなぜですか。同じ実行計画が実行されているのは、私のスキルを少し超えています(私はDBAではありません!)。

その結果、このようなことを無駄にするのに4日で十分だと判断したので、それを惜しみなくコーディングします(正直なところ、ストアドプロシージャは、再コーディングではなく、より増分的に再コーディングする必要がありました。 -とにかく毎週すべてのデータを計算します)、そしてこれをチョークで書き留めて体験してください。質問を開いたままにしておきます。帽子をリングに入れてくれたすべての人に感謝します。それはすべて役に立ちました。誰かがさらに何かを思いついた場合は、さらにいくつかのオプションを聞きたいです...そして誰かが見つけた場合この投稿は、独自の環境でこの動作を確認した結果です。うまくいけば、ここにいくつかのヒントがあり、自分で試してみて、私たちよりも完全に確認できることを願っています。

週末の準備ができました!

-ジェームズ

0 投票する
1 に答える
2174 参照

java - SQLサーバーでjdbcを使用してクエリプランを取得することは可能ですか?

JTDS ドライバーを使用していますが、Java クライアントが Mgmt studio で SQL を実行したときと同じクエリ プランを受信して​​いることを確認したいのですが、クエリ プラン (理想的には xml 形式) を取得する方法はありますか?

基本的に、私は同じ形式の出力が欲しい

管理スタジオにて。何か案は?

session_id の計画を取得するためのコード

0 投票する
5 に答える
212767 参照

java - jTDS接続文字列を作成します

SQLサーバーのインスタンス名はMYPC\SQLEXPRESSで、データベース「ブログ」に接続するためのjTDS接続文字列を作成しようとしています。誰かが私がそれを達成するのを手伝ってくれますか?

私はこのようにしようとしています:

そして私はこれを手に入れます:

0 投票する
2 に答える
1435 参照

sql-server-2005 - SQL Server 2005 および Hibernate でインデックスを使用する際の問題

インデックスを使用しない Hibernate によって生成されたクエリに問題があります。データベースへのアクセスは JTDS を使用して Java から行われ、サーバーのバージョンは SQL Server 2005の最新のサービス パックです。

フィールドは NULL 可能であり、特定のシナリオでは完全に NULL になる可能性がある外部キーです。列はクラスター化されていないインデックスを介してインデックス付けされますが、列が完全に NULL の場合、インデックスは使用されず、多数のフル テーブル スキャンが作成されます。そしてパフォーマンスの問題。

この状況は、次の SQL コードを含む標準のクエリ アナライザーを使用して確認することもできます。

テーブルとインデックスを作成する

newid 関数を使用して、いくつかのランダム データを入力します。

このクエリは、フル テーブル スキャンを実行します

「and DATANULL IS NOT NULL」でクエリを完了すると、クエリはインデックスを使用するようになりました。

助けが必要:

  • JTDS/Hibernate の組み合わせにインデックスを使用させるにはどうすればよいですか (sendStringParametersAsUnicode はデフォルトで既に false に設定されています)。
  • null 許容フィールドを使用するすべての hibernate クエリに「and column is not null」を追加する方法はありますか?
  • この動作について何か説明はありますか?

よろしくマッシモ

0 投票する
1 に答える
1748 参照

hibernate - JPA、Hibernate、およびjTDSが文字列列に常にvarchar(8000)を使用するのはなぜですか?

jdbcドライバーとしてJPA(Hibernate)とjTDSを使用しています。エンティティ列のデータ型がStringの場合は常に、作成されたプリペアドステートメントがvarchar(8000)そのパラメーターとして使用します。@Column(length=50)たとえば、すでにマッピングで使用しようとしましたが、無視されているようです。

sendStringParametersAsUnicodejTDS接続で設定した場合nvarchar(4000)、代わりに使用しますが、エンティティで定義した長さを尊重することはありません。その理由はありますか?

0 投票する
1 に答える
5375 参照

sybase - 「無効な SQL ステートメントまたは JDBC エスケープ、終了 '}' が見つかりません。」jTDS と Sybase を使用

ibatis 経由でストアド プロシージャを呼び出しています。jconn2.jar (5.5) を使用すると、動作し、動作しました。jtds jar (1.2.5) に交換すると、「無効な SQL ステートメントまたは JDBC エスケープ、終了 '}' が見つかりません」という例外が発生します。

透明性を高めるために、Spring と DBCP を使用しています。明らかに、jTDS での SQL コードの解析は好まれておらず、jconn2 で受け入れられています。このプロジェクトは私たちよりも前からあり、私はもう何年も Sybase を使っていません。

データ内の範囲外の文字は、「-」、「:」、および「.」です。

この問題を回避するには、ストアド プロシージャ呼び出しステートメントでパラメーターをエスケープする必要がありますか? jTDS に設定されていない jconn2 のデフォルト設定はありますか?

ありがとう。

0 投票する
2 に答える
4892 参照

sql-server - Activerecord、JDBC、JTDS、および統合セキュリティを使用して SQL Server に接続する方法

上記のように、私は試しました:

・・・など、さまざまな組み合わせが可能です。

私が得るたびに:

ユーザー情報なしで試してみると:

私はこの応答を受け取ります:

任意のヒント?ありがとう、

  • アクティブレコード (2.3.5)
  • activerecord-jdbc-adapter (0.9.6)
  • activerecord-jdbcmssql-adapter (0.9.6)
  • jdbc-jtds (1.2.5)
  • jruby 1.4.0 (ruby 1.8.7 パッチレベル 174) (2009-11-02 69fbfa3) (Java HotSpot(TM) Client VM 1.6.0_18) [x86-java]
0 投票する
2 に答える
3501 参照

java - CallableStatement.getResultSet() での NullPointerException

SQL Server 2005 にストアド プロシージャがあります。これは次のようになります (簡略化)。

このプロシージャを SQL Server Management Studio から実行すると、問題なく動作します。ただし、次のようなものを使用して、Java プログラムから同じ proc を呼び出すと、

最初に返される結果セットが NULL である理由がわかりません。誰かが私にこれを説明できますか?

回避策として、cs.getMoreResults() をチェックして true の場合は、別の getResultSet() を試してください。今回は適切な結果セットが返されます。

任意のポインタをお願いします? (問題がある場合は、JTDS ドライバーを使用しています)

ありがとう、ラージ