jdbi3をspring-bootに統合したいと思います。 しかし、全体像を把握するためにインターネットで必要なすべての要素を見つけるのは困難です。
jdbi3でSpring-Bootアプリケーションをセットアップする方法を紹介するjdbi-examples-repositoryをgithubに提供する機会はありますか?
よろしくお願いします。 どうもありがとう。
/ Seb
単純なケースでは、Springのトランザクション機能との統合が必要ない場合は、Spring構成でJdbi
とDAOを初期化するだけです。
<strong i="7">@Bean</strong>
public DataSource dataSource() {
// From Spring Boot's connection pool configuration;
}
<strong i="8">@Bean</strong>
public Jdbi createJdbi(DataSource dataSource) {
return Jdbi.create(dataSource);
}
<strong i="9">@Bean</strong>
public UserDao userDao(Jdbi jdbi) {
return jdbi.onDemand(UserDao.class);
}
こんにちは@ bastman 、 @ alwins0nは#989でより良いSpringサポートに貢献しています-これまでの彼の仕事をレビューして、Spring統合がより明確になるかどうか、または少し違うものを求めているかどうかについてコメントしますか?
jdbiをSpringBootに統合するのは簡単です。 @ arteamで示されているように、Jdbiインスタンスを返すには、 @Configuration
クラスに@Bean
アノテーション付きメソッドを設定する必要があります。
私の春のPRで行われたように、難しいのはjdbiを春のトランザクション管理に統合することです。 それがあなたが探しているものであるならば、あなたは間違いなくそれをチェックするべきです。
さらに、これが承認された場合、SpringBoot用のautoconfiguration / spring-boot-starterを作成することを検討しています(2)。 それがあなたが探しているものなら。 (実際に試してみたい場合は、優れたエクササイズです:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html)
私は問題なくjdbi2.xで次の方法を使用しています。 jdbi3.xでテストしていて、問題は発生していません。 これは、jdbiを使用しながらSpringでトランザクションを管理するためのより簡単な方法のように見えます。
基本的に、プロキシをTransactionAwareDataSourceProxyでラップし、それを使用してJdbiインスタンスを作成します。 (例が一貫しているように、 @ arteamの回答からc / p'dを
<strong i="8">@Bean</strong>
public DataSource dataSource() {
// From Spring Boot's connection pool configuration;
}
<strong i="9">@Bean</strong>
public TransactionAwareDataSourceProxy txDataSource(DataSource dataSource) {
return new TransactionAwareDataSourceProxy(dataSource);
}
<strong i="10">@Bean</strong>
public PlatformTransactionManager transactionManager(DataSource dataSource) {
//not sure if this is needed
return new DataSourceTransactionManager(dataSource);
}
<strong i="11">@Bean</strong>
public Jdbi createJdbi(TransactionAwareDataSourceProxy dataSource) {
//note that parameter is TransactionAwareDataSourceProxy instead of plain DataSource
return Jdbi.create(dataSource);
}
<strong i="12">@Bean</strong>
public UserDao userDao(Jdbi jdbi) {
return jdbi.onDemand(UserDao.class);
}
よさそうだ、このクラスが存在することを知らなかった。
前述のPRをご覧いただけますか? jdbiの基礎となる「トランザクション対応」接続ファクトリを再利用するという提案がすでに行われています。
iircの問題は、接続とハンドルが状態的に同期していないということです。 したがって、このdsは、トランザクションの終了時に閉じられる接続(トランザクションにバインドされている)を返します。 一方、使用されたハンドルは閉じられておらず、(再)使用しようとすると例外がスローされます。
しかし、これはそれほど大きな問題ではなく、むしろコーナーケースであり、ソリューションは99%のユースケースに適合します。
つまり、あなたのアプローチでは、トランザクション管理リソースは接続です。 私のPRでは、マネージドリソースはハンドルです。
stringtemplate4およびグループインポートでjdbi3を使用することに関連する問題があります。 私の問題を参照してくださいhttps://github.com/jdbi/jdbi/issues/1052
この問題には、Spring Boot2.0.0でjdbi3を使用するための完全に機能するリポジトリスケルトンへのリンクも含まれています。
Springの@Transactionalアノテーションを使用して@kaandokのソリューションを実装すると、開いているトランザクションが存在するときにハンドルを閉じるため、次の例外が発生します。 そのための推奨/適用可能な解決策はありますか?
「不適切なトランザクション処理が検出されました:トランザクションが開いているハンドルが閉じられました。ハンドルを閉じる前に、トランザクションを明示的にコミットまたはロールバックする必要があります。Jdbiはこのトランザクションを自動的にロールバックしました。」
@cengha問題を示すコードを提供していただけますか?
以下はconfigクラスです:
<strong i="6">@Bean</strong>
public HikariDataSource hikariDataSource() {
HikariConfig dataSourceConfig = new HikariConfig();
dataSourceConfig.setDriverClassName(driverClassName);
dataSourceConfig.setJdbcUrl(jdbcUrl);
dataSourceConfig.setUsername(username);
dataSourceConfig.setPassword(password);
dataSourceConfig.setAutoCommit(true);
return new HikariDataSource(dataSourceConfig);
}
<strong i="7">@Bean</strong>
public TransactionAwareDataSourceProxy transactionAwareDataSourceProxy(HikariDataSource dataSource) {
return new TransactionAwareDataSourceProxy(dataSource);
}
<strong i="8">@Bean</strong>
public PlatformTransactionManager platformTransactionManager(HikariDataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
<strong i="9">@Bean</strong>
public Jdbi jdbi(TransactionAwareDataSourceProxy transactionAwareDataSourceProxy) {
Jdbi jdbi = Jdbi.create(transactionAwareDataSourceProxy);
jdbi.installPlugin(new SqlObjectPlugin());
return jdbi;
}
これがサービスレイヤーです
<strong i="13">@Override</strong>
<strong i="14">@Transactional</strong>
public Long createX(X x) {
Long aLong = XDao.insertX(x);
if(true) throw new RuntimeException();
return aLong;
}
自動コミットがfalseに設定されている場合、トランザクションエラーについて言及しましたが、trueに設定されている場合、トランザクションエラーはありませんが、今回はロールバックが機能しないため(実行時例外の後)、Xオブジェクトがデータベースに永続化されます。 Spring 2.0.3、JDBI3.0.0-beta2を使用しています。
問題が解決しました。 このスレッドがライブラリを更新し、すべてが解決されたことに気付いた後、私は古いバージョンのJDBIを使用していました。
最も参考になるコメント
私は問題なくjdbi2.xで次の方法を使用しています。 jdbi3.xでテストしていて、問題は発生していません。 これは、jdbiを使用しながらSpringでトランザクションを管理するためのより簡単な方法のように見えます。
基本的に、プロキシをTransactionAwareDataSourceProxyでラップし、それを使用してJdbiインスタンスを作成します。 (例が一貫しているように、 @ arteamの回答からc / p'dを