3

ユーザータイプから使用されているデータベースを決定論的に判断する方法はありますか? ユーザー タイプは、データベース (HSQL か Oracle か) に応じて、異なるオブジェクトを prepareStatement.setObject に渡す必要があります。私は準備されたステートメントからDataBaseMetaDataを使用することを計画していました

preparedStatement.getConnection().getMetaData().getDatabaseProductName()

しかし、上記を比較してデータベースを特定できる、明確に定義された一連の文字列があるかどうかはわかりません。

私が解決しようとしているより大きな問題は、Oracle で DATE 列を使用しているのに対し、休止状態では JodaDateTime を TIMESTAMP (日付と時刻を保持できる唯一の型) にマップすることです。そのため、Oracle は、日付比較を実行する前に、DB の DATE 値をタイムスタンプに昇格させます。これにより、データベース インデックスがスキップされるため、パフォーマンスが低下します。列タイプを DATE から TIMESTAMP に変更するオプションは、より多くのスペースが必要であり、アプリケーションが秒を超える精度を必要としないため、除外されます。したがって、インデックスの不一致がないように、DateTime を oracle.sql.DATE に変換する userType を記述し、preparedStatement にパラメーターを設定する予定です。(スニペットを以下に示します):

    public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException {
    if (value == null) {
        Hibernate.TIMESTAMP.nullSafeSet(preparedStatement, null, index);
    } else {
        preparedStatement.setObject(index, new oracle.sql.DATE(new Timestamp(((DateTime) value).getMillis())), Types.DATE);
    }
}

上記のアプローチの問題点は、単体テスト用に別のデータベース (HSQLDB) を使用すると、HSQLDialect が「oracle.sql.DATE」を認識しないため、機能しないことです。ここで、userType から DB を認識し、preparedStatement にさまざまなオブジェクトを設定する必要があります。

だから、私は知りたいです

  • DATE-TIMESTAMP の不一致の問題を解決するためのより良い方法がある場合
  • そうでない場合、ユーザータイプからDBを正しく識別する方法。

ありがとう。

4

1 に答える 1

4

Dialect.getDialect ()を使用して、現在の方言を取得します。インスタンスタイプを確認して、データベースを確認してください。例:以下:

       Dialect dialect= Dialect.getDialect();
       //<-- compare against the expected dailect classes
       if(dialect instanceof OracleDialect){  
           //your database is oracle
       }else if(dialect instanceof HSQLDialect){
        //<-- compare against the expected dailect classes
           //your database is HSQL
       }

私はあなたの目的についてはよくわかりませんが、上記はあなたを助けるはずです。

于 2012-10-14T07:46:57.063 に答える