2017-05-09 17 views
0

Spring Jdbcを使用していますが、Connectionインターフェイス経由でjdbcテンプレートからデータベースベンダー名を取得するにはどうすればよいですか。 Springが提供するAPIがあり、DB名を保持する列挙型を与えることができるので、文字列の値をハードコードから切り離すことができます。Spring JdbcTemplateからデータベースベンダー名を取得する方法

答えて

1

DatabaseMetaData documentationに必要な情報があります。

String vendor = jdbcTemplate.getDataSource().getConnection().getMetaData().getDatabaseProductName(); 

UPDATED!

M. Deinumの推奨するとおり、ConnectionCallbackを使用すると、接続を閉じたり、世話をする必要がなくなります。例えば

private String getProduct() { 
    return this.jdbcTemplate.execute(new ConnectionCallback<String>() { 
     @Override 
     public String doInConnection(Connection connection) throws SQLException, 
      DataAccessException { 

      return connection.getMetaData().getDatabaseProductName(); 
     } 
    }); 
} 
+0

これを管理されていない接続を開くと、実際は危険です。代わりに 'ConnectionCallback'を使うか、接続をもう一度閉じてください。 –

+0

これは彼が望む情報を見つける方法の例です。もちろん、接続はうまく管理しなければなりませんが、ここでは問題にはなりません。問題はこれを見つける場所であり、Connectionを使わずにこの情報を得ることはできないと思います。 – Daniel

+0

私はそれを言っていません。しかし、私の経験では、ここからコードをコピー/ペーストしてからx回後にこのコードを呼び出すと、空きプールが原因で問題が発生します。したがって、あなたはそれを閉じる必要はありません(またはそれを閉じると思う) 'ConnectionCallback'を使用することをお勧めします。 –

0

あなたが基になる接続を取得するために、このようなものを使用して、データベース・メタデータから必要な情報を得れば、それを解放することができます。

DataSource dataSource = jdbcTemplate.getDataSource(); 
Connection connection = DataSourceUtils.getConnection(dataSource); 
String dbProductName = connection.getMetaData().getDatabaseProductName(); 
DataSourceUtils.releaseConnection(connection, dataSource); 

希望します。 !

+0

ありがとう、私はすでにこれを使用しています。問題は、上記のコードを使用せずに、特定のデータベースのベンダー名を知る必要があることです。とにかくDB用の列挙型を得ることができますか?このようなものhttp://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/jpa/vendor/Database.html文字列値に依存しません – redeemed

0

JdbcUtils#extractDatabaseMetaData方法を使用することです最も簡単な方法 - http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/support/JdbcUtils.html#extractDatabaseMetaData-javax.sql.DataSource-java.lang.String-

同様:

JdbcUtils.extractDatabaseMetaData(jdbcTemplate.getDataSource(), "getDatabaseProductName");

データベース製品名を正規化しようとしJdbcUtils#commonDatabaseName方法もある - http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/support/JdbcUtils.html#commonDatabaseName-java.lang.String-

+0

だから使用法は以下のようになりますか? – redeemed

+0

あなたがそれらを結合したいなら、あなたは 'commonDatabaseName'への引数を' String(文字列)としてキャストする必要がありますが、 '。 –

関連する問題