Spring Springデータソースの構成
10324 ワード
どのような永続化技術によっても、Springではデータソースから取得されるデータ接続によってデータベースにアクセスする必要があります.従来のアプリケーションでは、データソースはWebアプリケーションサーバが提供するのが一般的である.Springでは、JNDIでアプリケーションサーバのデータソースを取得するだけでなく、Springコンテナで直接データソースを構成することもできます.また、依存しないユニットテストを行うためにコードでデータソースを作成することもできます.
データ・ソースの構成
Springはサードパーティ依存パケットに2つのデータソースの実装クラスパケットを含み,1つはApacheのDBPP,2つはC 3 P 0である.Springプロファイルでは、どちらの構成データソースも使用できます.
DBPPデータソース
DBCPクラスパッケージは/lib/jakarta-commons/commons-dbcpにある.JAr,DBPPはJakarta commons-poolオブジェクトプールメカニズムに依存するデータベース接続プールであるため、クラスパスの下に/lib/jakarta-commons/commons-poolを含める必要がある.jar.以下にDBCPを使用してMySqlデータソースを構成する構成断片を示します.
xmlコード
BasicDataSourceでは、close()メソッドを使用してデータソースを閉じるため、Springコンテナが閉じるときにデータソースが正常に閉じるようにdestroy-method="close"属性を設定する必要があります.上記の必須データ・ソース・プロパティに加えて、一般的なプロパティもいくつかあります.
defaultAutoCommit:データ・ソースから返される接続が自動コミット・メカニズムを使用するかどうかを設定します.デフォルトはtrueです.
defaultReadOnly:データソースが読み取り専用のみを実行できるかどうかを設定します.デフォルトはfalseです.
maxActive:最大接続データベース接続数、0に設定した場合、制限がないことを示します.
maxIdle:最大待機接続数が0に設定されている場合、制限がないことを示します.
maxWait:最大待機秒数、単位はミリ秒で、時間を超えるとエラーメッセージが表示されます.
validationQuery:接続が正常に行われたかどうかを確認するために使用されるSQL文です.SQL文は、単純に「select count(*)from user」に設定できるように、少なくとも1行のデータを返さなければなりません.
removeAbandoned:自己中断するかどうか、デフォルトはfalseです.
removeAbandonedTimeout:数秒後にデータ接続が自動的に切断され、removeAbandonedがtrueになり、この値が提供されます.
logAbandoned:割り込みイベントを記録するかどうか、デフォルトはfalseです.
C 3 P 0データソース
C 3 P 0はオープンソースのJDBCデータソース実装プロジェクトであり、libディレクトリでHibernateとともに公開され、JDBC 3とJDBC 2拡張仕様の説明のConnectionとStatementプールを実現している.C 3 P 0クラスパッケージは/lib/c 3 p 0/c 3 p 0-0.9.0.4にある.jar.次に、C 3 P 0を使用してOracleデータ・ソースを構成します.
xmlコード
ComboooledDataSourceは、BasicDataSourceと同様に、Springコンテナが閉じたときにデータソースが正常に解放されるように、データソースを閉じるためのclose()メソッドを提供します.
C 3 P 0はDBCPよりも豊富な構成属性を持ち、これらの属性によって、データソースに対して各種の有効な制御を行うことができる.
acquireIncrement:接続プールの接続が切れたとき、C 3 P 0は一度に新しい接続の数を作成します.
acquireRetryAttempts:データベースからの新しい接続の取得に失敗した後に取得を繰り返す回数を定義します.デフォルトは30です.
acquireRetryDelay:2回の接続間隔、ミリ秒単位、デフォルトは1000です.
AutoCommitOnClose:接続が閉じると、コミットされていないすべての操作がデフォルトでロールバックされます.デフォルトはfalseです.
AutomaticTestTable:C 3 P 0は、Testという空のテーブルを作成し、独自のクエリー文を使用してテストします.このパラメータが定義されている場合、属性preferredTestQueryは無視されます.このTestテーブルでは何もできません.C 3 P 0テストで使用され、デフォルトはnullです.
breakAfterAcquireFailure:接続の取得に失敗すると、接続の取得を待機しているすべてのスレッドが例外を放出します.ただし、データ・ソースは有効に保持され、次回getConnection()を呼び出したときに接続の取得を試み続けます.trueに設定すると、接続の取得に失敗した後、データ・ソースは切断され、永続的に閉じることを宣言します.デフォルトはfalseです.
checkoutTimeout:接続プールが切れたときにクライアントがgetConnection()を呼び出して新しい接続の取得を待つ時間、タイムアウト後にSQLExceptionが投げ出され、0に設定すると無期限に待機します.単位ミリ秒、デフォルトは0です.
connectionTesterClassName:ConnectionTesterまたはQueryConnectionTesterのクラスを実装することで接続をテストします.クラス名はフルネームに設定する必要があります.デフォルトはcom.mchange.v2.C3P0.impl.DefaultConnectionTester;
idleConnectionTestPeriod:すべての接続プールの空き接続を数秒おきにチェックします.デフォルトは0です.チェックしないことを示します.
InitialPoolSize:初期化時に作成された接続数は、minPoolSizeとmaxPoolSizeの間で値をとる必要があります.デフォルトは3です.
maxIdleTime:最大アイドル時間、アイドル時間を超える接続は破棄されます.0または負数の場合は破棄されません.デフォルトは0です.
maxPoolSize:接続プールに保持されている最大接続数.デフォルトは15です.
maxStatements:JDBCの標準パラメータで、データ・ソースにロードされるPreparedStatementの数を制御します.ただし、プリキャッシュされたStatementは、接続プール全体ではなく単一のConnectionに属します.したがって、このパラメータを設定するには、maxStatementsとmaxStatementsPerConnectionが両方とも0の場合、キャッシュは閉じられます.デフォルトは0です.
maxStatementsPerConnection:接続プール内の1つの接続が持つ最大キャッシュStatement数.デフォルトは0です.
numHelperThreads:C 3 P 0は非同期で動作し、遅いJDBC動作はヘルププロセスによって完了する.これらの操作を拡張することで、パフォーマンスを効果的に向上させ、マルチスレッドによって複数の操作を同時に実行することができます.デフォルトは3です.
preferedTestQuery:すべての接続テストで実行されるテスト文を定義します.接続テストを使用する場合、このパラメータはテスト速度を著しく向上させることができます.テストされたテーブルは、初期データソースのときに存在する必要があります.デフォルトはnullです.
propertyCycle:ユーザーがシステム構成パラメータを変更して実行するまでの最大待機秒数.デフォルトは300です.
testConnectionOnCheckout:性能消費が大きいので必要なときだけ使用してください.trueに設定すると、各connectionがコミットされるたびに有効性が検証されます.idleConnectionTestPeriodまたはautomaticTestTableの使用を推奨
などの方法で接続テストの性能を向上させます.デフォルトはfalseです.
testConnectionOnCheckin:trueに設定すると、接続を取得しながら接続の有効性が検証されます.デフォルトはfalseです.
プロファイルを読み込む方法で属性を参照するには、次の手順に従います.
jdbc.propertiesプロパティファイルでプロパティ値を定義します.
jdbc.driverClassName= com.mysql.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3309/sampledb
jdbc.username=root
jdbc.password=1234
ヒント:${xxx}の前後にうっかりスペースを入力する開発者がよくいます.これらのスペース文字は変数と結合して属性の値として使用されます.たとえば、のプロパティ構成項目は、前後にスペースがあり、解析後、usernameの値は「1234」になり、最終的なエラーになりますので、特に注意する必要があります.
JNDIデータソースの取得
WebLogicやWebsphereなどの高性能アプリケーション・サーバにアプリケーションが構成されている場合、アプリケーション・サーバ自体が提供するデータ・ソースを使用することが望ましい場合があります.アプリケーション・サーバのデータ・ソースはJNDIオープン・呼び出し元を使用し、SpringはJNDIリソースを参照するJndiobjectFactoryBeanクラスを提供します.以下は簡単な構成です.
xmlコード
jndiNameで参照するJNDIデータソース名を指定します.
Spring 2.0はJ 2 EEリソースを取得するためにjeeネーミングスペースを提供し、jeeネーミングスペースを通じてJ 2 EEリソースの参照を効果的に簡略化することができる.以下はjeeネーミングスペースを使用してJNDIデータソースを参照する構成です.
xmlコード
Springのデータソース実装クラス
Spring自体もorgにある簡単なデータソース実装クラスDriverManagerDataSourceを提供している.springframework.jdbc.Datasourceパッケージにあります.このクラスはjavaxを実現した.sql.DataSourceインタフェースですが、プール化された接続メカニズムはありません.getConnection()を呼び出して新しい接続を取得するたびに、新しい接続を簡単に作成します.したがって、このデータ・ソース・クラスは、追加の依存クラスを必要としないため、ユニット・テストまたは単純な独立したアプリケーションで使用するのに適しています.
次に、DriverManagerDataSourceの簡単な使用を見てみましょう.もちろん、DriverManagerDataSourceを構成することで直接使用することもできます.
JAvaコード
小結
永続化テクノロジーにかかわらず、データ・ソースを定義する必要があります.Springには、2つのデータ・ソースのインプリメンテーション・クラス・パッケージが付属しており、定義を自分で選択できます.実際の導入では、アプリケーション・サーバ自体が提供するデータ・ソースを直接使用する場合があります.この場合、JndiobjectFactoryBeanまたはjeeネーミング・スペースを使用してJNDIのデータ・ソースを参照できます.
DBCPとC 3 PO構成の違い:
C3PO :DBCP:
xmlコード
xmlコード
データ・ソースの構成
Springはサードパーティ依存パケットに2つのデータソースの実装クラスパケットを含み,1つはApacheのDBPP,2つはC 3 P 0である.Springプロファイルでは、どちらの構成データソースも使用できます.
DBPPデータソース
DBCPクラスパッケージは/lib/jakarta-commons/commons-dbcpにある.JAr,DBPPはJakarta commons-poolオブジェクトプールメカニズムに依存するデータベース接続プールであるため、クラスパスの下に/lib/jakarta-commons/commons-poolを含める必要がある.jar.以下にDBCPを使用してMySqlデータソースを構成する構成断片を示します.
xmlコード
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3309/sampledb" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>
BasicDataSourceでは、close()メソッドを使用してデータソースを閉じるため、Springコンテナが閉じるときにデータソースが正常に閉じるようにdestroy-method="close"属性を設定する必要があります.上記の必須データ・ソース・プロパティに加えて、一般的なプロパティもいくつかあります.
defaultAutoCommit:データ・ソースから返される接続が自動コミット・メカニズムを使用するかどうかを設定します.デフォルトはtrueです.
defaultReadOnly:データソースが読み取り専用のみを実行できるかどうかを設定します.デフォルトはfalseです.
maxActive:最大接続データベース接続数、0に設定した場合、制限がないことを示します.
maxIdle:最大待機接続数が0に設定されている場合、制限がないことを示します.
maxWait:最大待機秒数、単位はミリ秒で、時間を超えるとエラーメッセージが表示されます.
validationQuery:接続が正常に行われたかどうかを確認するために使用されるSQL文です.SQL文は、単純に「select count(*)from user」に設定できるように、少なくとも1行のデータを返さなければなりません.
removeAbandoned:自己中断するかどうか、デフォルトはfalseです.
removeAbandonedTimeout:数秒後にデータ接続が自動的に切断され、removeAbandonedがtrueになり、この値が提供されます.
logAbandoned:割り込みイベントを記録するかどうか、デフォルトはfalseです.
C 3 P 0データソース
C 3 P 0はオープンソースのJDBCデータソース実装プロジェクトであり、libディレクトリでHibernateとともに公開され、JDBC 3とJDBC 2拡張仕様の説明のConnectionとStatementプールを実現している.C 3 P 0クラスパッケージは/lib/c 3 p 0/c 3 p 0-0.9.0.4にある.jar.次に、C 3 P 0を使用してOracleデータ・ソースを構成します.
xmlコード
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value=" oracle.jdbc.driver.OracleDriver "/>
<property name="jdbcUrl" value=" jdbc:oracle:thin:@localhost:1521:ora9i "/>
<property name="user" value="admin"/>
<property name="password" value="1234"/>
</bean>
ComboooledDataSourceは、BasicDataSourceと同様に、Springコンテナが閉じたときにデータソースが正常に解放されるように、データソースを閉じるためのclose()メソッドを提供します.
C 3 P 0はDBCPよりも豊富な構成属性を持ち、これらの属性によって、データソースに対して各種の有効な制御を行うことができる.
acquireIncrement:接続プールの接続が切れたとき、C 3 P 0は一度に新しい接続の数を作成します.
acquireRetryAttempts:データベースからの新しい接続の取得に失敗した後に取得を繰り返す回数を定義します.デフォルトは30です.
acquireRetryDelay:2回の接続間隔、ミリ秒単位、デフォルトは1000です.
AutoCommitOnClose:接続が閉じると、コミットされていないすべての操作がデフォルトでロールバックされます.デフォルトはfalseです.
AutomaticTestTable:C 3 P 0は、Testという空のテーブルを作成し、独自のクエリー文を使用してテストします.このパラメータが定義されている場合、属性preferredTestQueryは無視されます.このTestテーブルでは何もできません.C 3 P 0テストで使用され、デフォルトはnullです.
breakAfterAcquireFailure:接続の取得に失敗すると、接続の取得を待機しているすべてのスレッドが例外を放出します.ただし、データ・ソースは有効に保持され、次回getConnection()を呼び出したときに接続の取得を試み続けます.trueに設定すると、接続の取得に失敗した後、データ・ソースは切断され、永続的に閉じることを宣言します.デフォルトはfalseです.
checkoutTimeout:接続プールが切れたときにクライアントがgetConnection()を呼び出して新しい接続の取得を待つ時間、タイムアウト後にSQLExceptionが投げ出され、0に設定すると無期限に待機します.単位ミリ秒、デフォルトは0です.
connectionTesterClassName:ConnectionTesterまたはQueryConnectionTesterのクラスを実装することで接続をテストします.クラス名はフルネームに設定する必要があります.デフォルトはcom.mchange.v2.C3P0.impl.DefaultConnectionTester;
idleConnectionTestPeriod:すべての接続プールの空き接続を数秒おきにチェックします.デフォルトは0です.チェックしないことを示します.
InitialPoolSize:初期化時に作成された接続数は、minPoolSizeとmaxPoolSizeの間で値をとる必要があります.デフォルトは3です.
maxIdleTime:最大アイドル時間、アイドル時間を超える接続は破棄されます.0または負数の場合は破棄されません.デフォルトは0です.
maxPoolSize:接続プールに保持されている最大接続数.デフォルトは15です.
maxStatements:JDBCの標準パラメータで、データ・ソースにロードされるPreparedStatementの数を制御します.ただし、プリキャッシュされたStatementは、接続プール全体ではなく単一のConnectionに属します.したがって、このパラメータを設定するには、maxStatementsとmaxStatementsPerConnectionが両方とも0の場合、キャッシュは閉じられます.デフォルトは0です.
maxStatementsPerConnection:接続プール内の1つの接続が持つ最大キャッシュStatement数.デフォルトは0です.
numHelperThreads:C 3 P 0は非同期で動作し、遅いJDBC動作はヘルププロセスによって完了する.これらの操作を拡張することで、パフォーマンスを効果的に向上させ、マルチスレッドによって複数の操作を同時に実行することができます.デフォルトは3です.
preferedTestQuery:すべての接続テストで実行されるテスト文を定義します.接続テストを使用する場合、このパラメータはテスト速度を著しく向上させることができます.テストされたテーブルは、初期データソースのときに存在する必要があります.デフォルトはnullです.
propertyCycle:ユーザーがシステム構成パラメータを変更して実行するまでの最大待機秒数.デフォルトは300です.
testConnectionOnCheckout:性能消費が大きいので必要なときだけ使用してください.trueに設定すると、各connectionがコミットされるたびに有効性が検証されます.idleConnectionTestPeriodまたはautomaticTestTableの使用を推奨
などの方法で接続テストの性能を向上させます.デフォルトはfalseです.
testConnectionOnCheckin:trueに設定すると、接続を取得しながら接続の有効性が検証されます.デフォルトはfalseです.
プロファイルを読み込む方法で属性を参照するには、次の手順に従います.
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/jdbc.properties"/>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<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>
jdbc.propertiesプロパティファイルでプロパティ値を定義します.
jdbc.driverClassName= com.mysql.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3309/sampledb
jdbc.username=root
jdbc.password=1234
ヒント:${xxx}の前後にうっかりスペースを入力する開発者がよくいます.これらのスペース文字は変数と結合して属性の値として使用されます.たとえば、のプロパティ構成項目は、前後にスペースがあり、解析後、usernameの値は「1234」になり、最終的なエラーになりますので、特に注意する必要があります.
JNDIデータソースの取得
WebLogicやWebsphereなどの高性能アプリケーション・サーバにアプリケーションが構成されている場合、アプリケーション・サーバ自体が提供するデータ・ソースを使用することが望ましい場合があります.アプリケーション・サーバのデータ・ソースはJNDIオープン・呼び出し元を使用し、SpringはJNDIリソースを参照するJndiobjectFactoryBeanクラスを提供します.以下は簡単な構成です.
xmlコード
jndiNameで参照するJNDIデータソース名を指定します.
Spring 2.0はJ 2 EEリソースを取得するためにjeeネーミングスペースを提供し、jeeネーミングスペースを通じてJ 2 EEリソースの参照を効果的に簡略化することができる.以下はjeeネーミングスペースを使用してJNDIデータソースを参照する構成です.
xmlコード
<beans xmlns=http://www.springframework.org/schema/beans
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:jee=http://www.springframework.org/schema/jee
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/bbt"/>
</beans>
Springのデータソース実装クラス
Spring自体もorgにある簡単なデータソース実装クラスDriverManagerDataSourceを提供している.springframework.jdbc.Datasourceパッケージにあります.このクラスはjavaxを実現した.sql.DataSourceインタフェースですが、プール化された接続メカニズムはありません.getConnection()を呼び出して新しい接続を取得するたびに、新しい接続を簡単に作成します.したがって、このデータ・ソース・クラスは、追加の依存クラスを必要としないため、ユニット・テストまたは単純な独立したアプリケーションで使用するのに適しています.
次に、DriverManagerDataSourceの簡単な使用を見てみましょう.もちろん、DriverManagerDataSourceを構成することで直接使用することもできます.
JAvaコード
DriverManagerDataSource ds = new DriverManagerDataSource ();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3309/sampledb");
ds.setUsername("root");
ds.setPassword("1234");
Connection actualCon = ds.getConnection();
小結
永続化テクノロジーにかかわらず、データ・ソースを定義する必要があります.Springには、2つのデータ・ソースのインプリメンテーション・クラス・パッケージが付属しており、定義を自分で選択できます.実際の導入では、アプリケーション・サーバ自体が提供するデータ・ソースを直接使用する場合があります.この場合、JndiobjectFactoryBeanまたはjeeネーミング・スペースを使用してJNDIのデータ・ソースを参照できます.
DBCPとC 3 PO構成の違い:
C3PO :DBCP:
xmlコード
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseName</value>
</property>
<property name="user">
<value>testAdmin</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>
xmlコード
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseName</value>
</property>
<property name="username">
<value>testAdmin</value>
</property>
<property name="password">
<value>123456</value>
</property>
</bean>