タグ付けされた質問 「jdbc」

1
JDBCで明示的なコミットを無効にする、SQLで検出する、またはデータベースを読み取り専用状態にする
背景:私はhttp://sqlfiddle.com(私のサイト)に取り組んでおり、そこで悪用される可能性のある1つの手段を防止しようとしています。私が現在取り組んでいる問題について尋ねることによって、潜在的な虐待を不注意に悪化させないことを望んでいますが、あなたは何ができますか?皆さんを信頼しています。 任意のユーザーが特定のトランザクションブロック内で明示的な「コミット」呼び出しを発行することを防止したいと思います。SQL Fiddleのコンテキストから見ると、トランザクションブロックは右側のパネルで実行されるコードです。基本的に、ループしてプレーンテキストのSQLコマンドのリストを実行し、それらの変更がすべてバッチの最後に確実にロールバックされるようにします。通常、それらの変更はロールバックされますが、テキスト内に明示的な「コミット」ステートメントがある場合があるため、もちろん私のロールバックは機能しません。この明示的なコミットは、SQL Fiddleでスキーマを壊そうとするユーザーによるものである可能性が高いため、他のユーザーがエラーを確認します。 主な望ましい結果:可能であれば、JDBCレベルで明示的なコミットを無効にします。これは、複数のデータベースバックエンドベンダーをサポートする必要があるためです。もちろん、それぞれのベンダーには低レベルの癖があります。 フォールバックオプション:明示的なコミットを無効にするようにJDBCを構成できない場合、SQL Server、Oracle、MySQL、およびPostgreSQLの各バックエンドのバッチを処理中に明示的なコミットを検出するためのソリューションを利用できます。 SQL Serverの場合、このソリューションを考えました。実行する前にステートメントのXMLクエリプランを解析し、このXPathに一致するエントリの存在を確認します。 //*[@StatementType="COMMIT TRANSACTION"] これはSQL Serverでかなりうまくいくと思います。ただし、このアプローチは他のDBタイプでは機能しません。明示的なコミットに関するOracleのXML実行計画の出力は、コミットステートメントを実行しているという事実を参照していません(むしろ、コミットしているクエリから実行計画の出力を単純に繰り返します)。PostgreSQLおよびMySQLは、明示的なコミットに対して実行計画の出力(XMLまたはそれ以外)を一切提供しません。 そのため、「コミット」という単語の実際のステートメントを確認できます。これは機能しますが、可能なすべての種類のバリエーションがある場合を除きます。 declare @sql varchar(50) set @sql = 'com' + 'mit' exec(@sql); 上記はSQL Serverの例です(回避できます)が、Oracle、MySQL、PostgreSQLでも同様のことが可能だと思います。私はその仮定で間違っていますか?たぶん、彼らは「動的な」コミット文を許可しないでしょうか?Oracle、MySQL、PostgreSQLで同様のことができるかどうかを確認するために、SQL Fiddle(できればサンプルスキーマまたは他の誰かが作業している可能性のあるものではない)を自由に使用してください。そうでない場合は、単純な文字列の検出が機能する可能性があります。 さらに別の可能性 別のオプションがありました-これらのデータベースのいずれかを読み取り専用モードに設定する方法を知っている場合、そのモードでは何もコミットできませんが、それも機能します。そのモードで何もコミットできない限り、トランザクションの開始とトランザクション内でのコードの実行を許可する必要があります。それは可能ですか? 更新 私が最近学んだこと-これは実際にはPostgreSQLの問題ではありません。トランザクションブロック内で発行されたコミットは、その同じブロックが最終的に(Postgresで)ロールバックされた場合には適用されないようです。Postgresの皆さん、ありがとう! PhilのSO投稿へのリンクのおかげで、DEFERRABLE INITIALLY DEFERREDハックを使用してOracleを達成できると思います(コミットが発行されるとエラーがスローされますが、それを回避できます)。これはOracleに対処する必要があります。(ネストされたトランザクションがここで機能するかもしれないと少しの間考えましたが、Oracleがネストされたトランザクションをサポートしているようには見えませんか?とにかく、このように機能するものは見つかりませんでした)。 MySQLのソリューションはまだありません。ネストされたトランザクションを使用してみましたが、動作しないようです。右側のSELECT以外は許可しない、または各クエリの後にDBを削除/再作成するなど、MySQLのより抜本的なアプローチを真剣に考えています。どちらも良い音ではありません。 解決 したがって、SQL ServerとOracleについて説明したソリューションを実装しましたが、前述したように、これは実際にはPostgreSQLの問題ではありません。MySQLの場合、クエリパネルをselectステートメントのみに制限するというやや不幸なステップを踏んでいます。MySQLのDDLとDMLは、スキーマパネル(左側)で入力するだけです。これがあまりにも多くの古いフィドルを壊さないことを願っていますが、それは単にデータの一貫性を確保するために行わなければならないことだと思います。ありがとう!

2
MariaDB Javaクライアントは、MySQL JDBC(Connector / J)に完全に置き換わるものですか?
前提:MySQLデータベースへのJDBC接続を行うJavaアプリケーションを出荷します。(この記事の執筆時点では、5.1または5.5である可能性がありますが、質問と回答がバージョンに大きく依存しないことを願っています。) 観察:明らかに、MySQL JDBCドライバー(Connector / J)またはMariaDB JDBCドライバー(MariaDB Javaクライアント)を使用して、MySQLサーバーに接続できます。ISVの観点からの大きな利点の1つは、MariaDBドライバーがLGPLライセンスであり、MySQLドライバーがGPLライセンスであるということです。MariaDBドライバーのパフォーマンスは非常に良いようです。 質問:MariaDB JDBCドライバーは、MySQL JDBCドライバーの完全な代替品ですか? 私はこの2つの相対的なメリットについての議論を求めているのではありません。しかし、むしろ私は誰かがこれらのいずれかに沿って答えてくれることを望んでいます: MariaDB JDBCドライバーにはXとYに関する重要な問題があるため、これらのいずれかを使用すると問題が発生します。 一部の記事、仕様、コード、またはその他の証拠に基づいて、MariaDB JDBCドライバーは、MySQLドライバーで使用可能なすべてのメソッドを(少なくとも)完全に実装します。大丈夫だよ。
11 mysql  mariadb  jdbc 

3
大きなバッチの挿入速度
私のアプリケーションでは、INSERTにかなりの時間がかかっているようです。テーブルに挿入するオブジェクトがメモリ内に多数(約40〜50,000)あります。 サンプルテーブルを見てみましょう CREATE TABLE bill ( id BIGINT(20) PRIMARY KEY, amount INT(11) DEFAULT 0, bill_date DATETIME DEFAULT NOW(), INDEX (bill_date) ) ENGINE=InnoDB 私のバッチサイズとして3行を取ると、以下は挿入するために考えられるアプローチです アプローチ1-3つのrawインサートを作成して起動する INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00'); INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00'); INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 …
10 mysql  innodb  insert  java  jdbc 

4
MySQLはなぜメモリ不足だと言っているのですか?
INSERT...SELECTJDBCを使用してMySQLでかなり大きなサイズを実行しようとしましたが、次の例外が発生しました。 Exception in thread "main" java.sql.SQLException: Out of memory (Needed 1073741824 bytes) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 実際にはResultSetオブジェクトを返すわけではないので、Javaヒープ領域は問題にならないはずです。しかし、とにかくそれを上げようとしたところ、うまくいきませんでした。次に、MySQL Workbenchでステートメントを実行しようとすると、基本的に同じものが得られました。 Error Code 5: Out of memory (Needed 1073741816 bytes) これらの操作を完了するには十分なRAMが必要です(選択するテーブル全体に収まるほど)が、すべてのメモリを活用するために微調整する必要のあるさまざまな設定があると思います。Amazon EC2 ハイメモリダブルエクストララージインスタンスをWindows Server 2008 AMIで実行しています。my.iniファイルをいじって、より良い設定を使用しようとしましたが、すべての状況で、状況がさらに悪化した可能性があることはわかっています。これがそのファイルのダンプです。 [client] port=3306 [mysql] default-character-set=latin1 [mysqld] port=3306 basedir="C:/Program Files/MySQL/MySQL Server 5.5/" datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/" character-set-server=latin1 default-storage-engine=INNODB sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" max_connections=100 query_cache_size=1024M table_cache=256 …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.