Spring フレームワークで JOOQ を使用しようとした人はいますか?
8 に答える
はい、多くの人が(今までに)持っています。また、jOOQ マニュアルには、 jOOQ、Spring、Spring-TX、およびBoneCPの使用を開始する方法に関するチュートリアルが含まれています。
プロジェクトをセットアップするためのすべてのステップを説明している、Petri Kainulainen による非常に優れたチュートリアルもあります。
- Spring での jOOQ の使用: 構成
- Spring での jOOQ の使用: コード生成
- Spring で jOOQ を使用する: CRUD
- Spring での jOOQ の使用: ソートとページネーション
以下は、Spring Boot で jOOQ を使用する方法に関するブログ投稿です。特に、jOOQ の商用ディストリビューションが必要な場合に役立ちます。
Spring の JdbcTemplate および関連クラスにクエリを提供するためのビルダー ライブラリとして jOOQ を使用しようとしていました。残念ながら、jOOQ は、SQL 生成とクエリ実行という 2 つの概念を同じクラスのセットに統合しているように見えます。私の場合、前者が必要ですが、Spring に後者を処理させたいと考えています。ただし、機能します。たとえば、次のようなことができます (jOOQ 2.x API を使用):
Factory create = new Factory(null, SQLDialect.ORACLE);
getJdbcTemplate().query(
create.select(create.field(ID_COL),
create.field(VALUE_COL))
.from(FOO_TABLE)
.where(create.field(ID_COL).equals("ignored"))
.getSQL(),
myRowMapper,
id);
jOOQ で実行されている春のトランザクションを取得することは、はるかに簡単です (何かを忘れていない限り)。
データソースをラップするだけです
org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
オプション: 最初の実際の sql ステートメントが発生するまで jdbc 接続を開くのを遅らせるには
org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy
サンプルとしてこれを実行して、「トランザクション」と「遅延」が適用された jOOQ ファクトリを作成します。
DataSource rawDS = /* your actual data source */
// (optional) make access lazy
final DataSource lazyDS = new LazyConnectionDataSourceProxy(rawDataSource);
// make spring transactions available in plain jdbc context
final DataSource txDS = new TransactionAwareDataSourceProxy(lazyDS);
// create jOOQ factory
Factory jooq = new Factory(txDS, /* dialect */, /* settings */)
// voila!
jOOQをSpringで動作させるために必要な/知っておくべきことは次のとおりです。
java.sql.Connection
トランザクション マネージャーによってスレッドへのバインドを取得します。- 例外変換によってトランザクションを適切に処理する
- jOOQ Factoryオブジェクトは (名前にもかかわらず) スレッドセーフではないことを理解してください。したがって、使用ごとに新しいオブジェクトをインスタンス化する必要があります(この他の回答を行わないでください)。
したがって、最初と2番目のケースでは、 Lukasが推奨することを行うhttps://gist.github.com/3669307という要点を提供します。
3 番目のケースでは、基本的にファクトリのファクトリ ( を含む) を作成するか、 Springコンポーネントのワイヤードを使用して各メソッドでDataSource
新しいオブジェクトをインスタンス化することができます。Factory
DataSource
@Service
public class MyDaoOrService {
@Autowired
private void DataSource dataSource;
@Transactional
public void doSomeJooq(){
Settings s = new Settings();
//You could instead put this jooq configuration xml
s.getExecuteListeners().add("com.snaphop.jooq.SpringExceptionTranslationExecuteListener");
MyGeneratedFactory f = new MyGeneratedFactory(dataSource, s);
f.select(); //etc
}
}
設定リスナーに関しては、プログラムによる作成を避けるために JOOQ の構成サポートを使用できます。
Spring でのセットアップ方法についてDataSource
は、無数の他の/より良い場所で説明されているため、説明しません。
Java 構成 (Spring Boot のデフォルト) では、次のコードを使用できます。
/* JOOQ Configuration */
@Bean
public DataSourceConnectionProvider dataSourceConnectionProvider() {
return new DataSourceConnectionProvider(dataSource());
}
@Bean
public DefaultConfiguration defaultConfiguration() {
DefaultConfiguration defaultConfiguration = new DefaultConfiguration();
defaultConfiguration.setConnectionProvider(dataSourceConnectionProvider());
defaultConfiguration.setSQLDialect(SQLDialect.POSTGRES);
return defaultConfiguration;
}
@Bean
public DSLContext dslContext() {
return new DefaultDSLContext(defaultConfiguration());
}
Spring を使用して Web アプリケーションを構築していると仮定すると、おそらく次のようなことをしたいと思うでしょう。
try {
Connection conn = dataSource.getConnection();
try {
// Do something with JOOQ
// No need to use a JdbcTemplate!
}
finally {
if (conn != null) {
conn.close();
}
}
} catch (SQLException e) {
// your error handling
}
Web コンテナー (Tomcat など) が DataSource を提供し、接続プーリングを行っているため、おそらく Spring の依存性注入を介して DataSource を取得する必要があります。春の設定ファイルの1つに、次のようなものがあります
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/>
上記のコードが含まれているオブジェクト (またはこのコードにデータソースを提供するオブジェクト) は、データソースでインスタンス化するために、Spring ファイルに構成を持つことができます。
<bean id="fooService" class="com.fubar.FooServiceImpl">
<constructor-arg ref="dataSource" type="javax.sql.DataSource" />
</bean>
文字列「jdbc/datasource」の部分は、Web コンテナーで構成されたリソース名に対応します。これはさまざまですが、Tomcat の場合は、Tomcat ホームの下の conf/Catalina/localhost にあるコンテキスト ファイルである可能性があります。たとえば、
<?xml version="1.0" encoding="UTF-8"?>
<Context debug="10" reloadable="true" useNaming="true" antiJARLocking="true">
<Resource name="jdbc/datasource" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" validationQuery="SELECT 1"
username="foo" password="fubar" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost/foobase"/>
</Context>
jOOQ で Spring トランザクションを使用する最も簡単な方法 (私が見つけた) は、次のとおりです。
より良い説明については、この回答をご覧ください: https://stackoverflow.com/a/24380508/542108