web-dev-qa-db-ja.com

JOOQと春

SpringフレームワークでJOOQを使用しようとした人はいますか、それとも私は新境地を開拓していますか?

http://www.jooq.org

27
donaldh

はい、多くの人が(今までに)持っています。また、jOOQマニュアルには、 jOOQ 、Spring、Spring-TX、および BoneCP の使用を開始する方法に関するチュートリアルが含まれています。

Petri Kainulainenによる非常に優れたチュートリアルもあり、プロジェクトを設定するためのすべてのステップを説明しています。

Spring BootでjOOQを使用する方法についてのブログ投稿は、次のとおりです。特に、jOOQの商用ディストリビューションが必要な場合に役立ちます。

21
Lukas Eder

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);
16
David

jOOQでSpringトランザクションを実行する方がはるかに簡単です(何かを忘れていない限り):

データソースをにラップするだけです

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!
7
Peter Ertl

JOOQを春で機能させるために必要なこと/知っていることはすべて:

  1. トランザクションマネージャによってスレッドにバインドされたJava.sql.Connectionを取得します。
  2. 例外変換を通じてトランザクションを適切に処理する
  3. JOOQFactoryオブジェクト(名前にもかかわらず)はスレッドセーフではないことを理解してください。したがって、使用ごとに新しいオブジェクトをインスタンス化する必要があります(これ以外は行わないでください answer )。

したがって、最初と2番目のケースでは、この要点を提供します: https://Gist.github.com/3669307 これは Lukasが推奨 を実行します。

3番目のケースでは、基本的にファクトリのファクトリ(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を設定する方法については説明しません。これは、他の/より良い場所でカバーされているためです。

7
Adam Gent

これが誰かに役立つことを願っています...

Springアプリケーションのコンテキスト構成。

 <bean id="propertyConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName">
            <value>SYSTEM_PROPERTIES_MODE_OVERRIDE</value>
        </property>
        <property name="searchSystemEnvironment">
            <value type="boolean">true</value>
        </property>
    </bean>



    <bean id="dataSource" 
        class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <property name="driverClassName" value="org.h2.Driver"/>
        <property name="url" 
        value="jdbc:h2://${user.home}
        ${file.separator}tracciabilitaCanarini${file.separator}db${file.separator}basedb"/>
        <property name="username" value="sa"/>
        <property name="password" value="sa"/>
    </bean>

    <bean id="datasourceConnection" 
     class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" 
      lazy-init="true" depends-on="dataSource">
        <property name="targetObject">
            <ref bean="dataSource"/>
        </property>
        <property name="targetMethod">
            <value>getConnection</value>
        </property>
    </bean>

    <bean id="publicFactory" class="dbLayer.db.PublicFactory" lazy-init="true"
      depends-on="datasourceConnection" >
        <constructor-arg index="0" ref="datasourceConnection"  />
    </bean>

指定された接続でパブリックファクトリを自動的に埋めます(はい、自動クローズなどでプールされた接続にすることができます。詳細な構成については、DriverManagerDataSourceクラスを参照してください)。そして今、publicFactory。注:jOOQによって生成された元のパブリックファクトリを変更する必要はありません。

/**
 * This class is generated by jOOQ
 */
package dbLayer.db;

/**
 * This class is generated by jOOQ.
 */
@javax.annotation.Generated(value    = {"http://www.jooq.org", "2.0.5"},
                            comments = "This class is generated by jOOQ")
public class PublicFactory extends org.jooq.util.h2.H2Factory {

    private static final long serialVersionUID = -1930298411;

    /**
     * Create a factory with a connection
     *
     * @param connection The connection to use with objects created from this factory
     */
    public PublicFactory(Java.sql.Connection connection) {
        super(connection);
    }

    /**
     * Create a factory with a connection and some settings
     *
     * @param connection The connection to use with objects created from this factory
     * @param settings The settings to apply to objects created from this factory
     */
    public PublicFactory(Java.sql.Connection connection, org.jooq.conf.Settings settings) {
        super(connection, settings);
    }
}

最後に、単に工場に電話してください。

 PublicFactory vs = (PublicFactory) SpringLoader.getBean("publicFactory");
    SimpleSelectQuery<VersionRecord> sq = vs.selectQuery(dbLayer.db.tables.Version.VERSION);
    VersionRecord v = null;
                try {
                    v = sq.fetchAny();
                } catch (Exception e) {
                    log.warn("Seems that version table does not exists!", e);
                }

完了!

3
Agharta

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またはwhathaveyouがデータソースを提供し、接続プールを実行しているため、Springの依存性注入を介してデータソースを取得することをお勧めします。春の設定ファイルの1つに、次のようなものがあります。

<jee:jndi-lookup id="dataSource" jndi-name="Java:comp/env/jdbc/datasource"/>

上記のコードが含まれているオブジェクト(またはこのコードにデータソースを提供するオブジェクト)は、次のように、データソースでインスタンス化するためのスプリングファイルの構成を持つことができます。

<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>
3
EricS

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());
}
2
Przemek Nowak

JOOQでSpringTransactionsを使用する最も簡単な方法(私が見つけた)はここにあります: http://blog.liftoffllc.in/2014/06/jooq-and-transactions.html

より良い説明のためにこの答えを見てください: https://stackoverflow.com/a/24380508/542108

1
CodePredator