2017-04-07 10 views
2

私はデータソースを作成する2つの方法があります。Spring Webアプリケーションでデータソースを作成する適切な方法は何ですか?

  1. 春のコンテキスト内

    <bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/mkyongjava" /> 
    <property name="username" value="root" /> 
    <property name="password" value="password" /> 
    

  2. TomcatのJNDI

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
<property name="jndiName" value="java:comp/env/jdbc/UsersDB"/> 

春を使用してデータソースを作成するか、TomcatのJNDIを使用する利点と問題点は何ですか?

答えて

3

この中で良い習慣のようなものは何もありません。良いものはユースケースに良いものです。彼らには賛否両論がある。

複数のアプリケーションが共通のデータソースを共有するサーバー環境にアプリケーションをデプロイしようとしているユースケースや、データソースコンポーネントがサーバー管理によって管理されている場合は、JNDIコンテキストを使用するのが最適な方法でしょう。サーバーは、アプリケーションがそのオブジェクトを直接取得し、自身にバインドしてデータソースを使用できるように、DataSourceを準備した状態にします。

アプリケーションが組み込まれたサーバーコンテナまたはクラウドコンテナの内部で実行され、アプリケーションでデータソースを作成するビルドパックに埋め込まれたクラウドコンテナを使用する場合は、良い解決策になります。また、非Webアプリケーション環境では、データソースを作成するのが良いでしょう。

要約すると、アプリケーションによってデータソースが管理されておらず、JNDIコンテキストに適している場合を使用します。

アプリケーションの展開モデルが何であるかを把握し、何が良いのかを考えてみてください。また、DBCP、C3P0、Hikarcpなどのパフォーマンスを向上させるために、datasourcepoolの実装を使用してみてください。

+0

私は英雄を使用しています。だから、私の場合は、組み込みサーバ内で実行されているアプリケーションです。 – brazuka

+1

DBCPのBasicDataSourceを使用することができます。これは既にConnectionプールが組み込まれています。 Herokuでの私の経験で、それはまた、より良いパフォーマンスを提供します。 –

+0

私のアプリケーションは、私が望むより多くの接続を開いていると思います。 Spring JDBC Templateはクエリを実行するたびにDriverManagerDataSourceを使用して新しい接続を開き、それを閉じます。 DBCPのBasicDataSourceを使用すると、開いている新しいものではなく接続を再利用しますか? – brazuka

1

私は以下のように使用しています。プロジェクトはアーキテクチャ設計時に設定されているので、私のために働きます。そしてその生産に生きています。

<!-- Local Apache Commons DBCP DataSource that refers to a combined database --> 
    <!-- (see dataAccessContext-jta.xml for an alternative) --> 
    <!-- The placeholders are resolved from jdbc.properties through --> 
    <!-- the PropertyPlaceholderConfigurer in applicationContext.xml --> 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="validationQuery" value="${jdbc.validationquery}"/> 
     <property name="testOnBorrow" value="${jdbc.testonborrow}"/> 
     <property name="driverClassName" value="${jdbc.driverClassName}"/> 
     <property name="url" value="${jdbc.url}"/> 
     <property name="username" value="${jdbc.username}"/> 
     <property name="password" value="${jdbc.password}"/> 
    </bean> 


    <!-- Transaction manager for a single JDBC DataSource --> 
    <!-- (see dataAccessContext-jta.xml for an alternative) --> 
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

これも参照できます。 Java開発者にGeniousのベスト貢献。

https://www.mkyong.com/spring-boot/spring-boot-jdbc-oracle-database-commons-dbcp2-example/

+0

なぜtransactionManagerを使用していますか? – brazuka

+0

あなたは質問に答えませんでした。彼はこれらの2つの違いと最高のアプローチは何かを尋ねています。彼はコピー貼りの例を要求していません.... –

+0

私は両方とも賛否両論があることを知っています。練習が良いかどうかを判断する経験があると思います。 –

3

第1のアプローチは、クラスDriverManagerDataSourceを使用して、テストまたはJ2EEコンテナの外部のスタンドアロン環境に有用です。

jndiデータsoureを使用する2番目の方法は、j2eeコンテナで使用することをお勧めします。

下記の参考文献は、これらのアプローチを明確に述べている。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/DriverManagerDataSource.html

0

あなたが書いたコードでデータベース構成を公開しないことをお勧めします。サーバーコンソールの内部で構成し、jndiとして公開することが常にベストです。春のコンフィギュレーション・ファイル内では、などのデータベースインスタンスを取得:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc"/> 

として、データベースのトランザクションマネージャを設定します。ここでのキーノートでは、データベースの設定を公開していないです

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

関連する問題