かなり基本的な構成の基本的なSpring JDBCアプリケーションがあります。
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="Oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:Oracle:thin:@1.1.1.1:1521:XXX"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</bean>
<bean id="dbThing" class="com.DbThing">
<property name="dataSource" ref="myDataSource"/>
</bean>
接続プールを導入したいと思います。SOでいくつかのスレッドを読んだ後、使用するプーリングライブラリについて少し混乱しています。
SO=でより多くのクレジットを持っていると思われるライブラリは、 C3P および [〜#〜] dbcp [〜#〜] です。 Oracleを使用している場合、ドライバーが提供する プールされたデータソース も使用できます。
より多くのライブラリが利用可能であることを理解しています-例えば、新しいApache Tomcat 7プーリングライブラリ。
私が本当に避けるべきライブラリはありますか?
特定のライブラリで使用する推奨構成はありますか?
共有したい「戦争物語」はありますか?
C3POとDBCPの開発は、それらが成熟しているためにほとんど停止しています。私はこれらのドライバーの両方が毎秒数百のトランザクションをサポートできることを見てきました。
Tomcatプールは、再作成および更新されたDBCPドライバーです。 MyBatis 3.0には独自のプーリング実装も含まれており、コードインスペクションに基づくと堅実に見えます。最後に、 BoneCP があり、これが最高のパフォーマンスを発揮すると主張しています。これらはまだプロジェクトで使用していません。
おそらく最善のアドバイスは、テストするものを選ぶことです。 Springを使用すると、後で簡単に交換できます。
BoneCPの代替として、おそらくOracle独自のデータベース接続プールを試しましたか?
ここ数週間、私は良い経験をしてきたので、試してみる価値があるかもしれません-また、特に独自のデータベースと組み合わせた場合、接続プールの作成についてOracleが知っていると思います。
<bean id="dataSource" class="Oracle.jdbc.pool.OracleConnectionPoolDataSource">
<property name="URL" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
[〜#〜] update [〜#〜]:また、最新のOracle JDBCドライバー(11.2.0.1)を使用している場合+)、新しいユニバーサル接続プールを試してみることができます。 OracleConnectionPoolDataSource
は、このプールを支持して公式に廃止されたようです。ただし、一部のユーザーはそれを使用してエラーを報告しているため、早すぎる可能性があります。私はOracleの最新のJDBCドライバーを使用する立場にあるので、この情報があればすぐにここで試して更新します。
これに関する詳細SO thread: Oracle UCP
BoneCP
は主張していますが、HiKariCP
という名前の新しいツールが導入されました。これは、application-context.xml
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="maximumPoolSize" value="10" />
<property name="minimumPoolSize" value="2" />
<property name="dataSourceClassName"
value="Oracle.jdbc.pool.OracleDataSource" />
<property name="dataSourceProperties" ref="props" />
<property name="poolName" value="springHikariCP" />
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikariConfig" />
</bean>
<util:properties id="props" location="classpath:datasource.properties"/>
どこでdatabase.properties
以下のようなデータベースの詳細を提供する必要があります
url=jdbc:Oracle:thin:@IP:port:SID/Databasename
user=usernmae
password=password
適切なデモを行うには、 このリンク を使用できます
間違いなくC3P0を使用できます。これはエンタープライズソリューション用に開発されています。利点を確認するには この回答に従ってください 。
統合のコード例:
_@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager =
new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
_
このBeanはJpaTransactionManager
を取得するためのものです。
_@Primary
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
entityManagerFactoryBean.setPackagesToScan("YOUR.DATABSE.ENTITY.PACKAGE");
entityManagerFactoryBean.setJpaProperties(hibProperties());
return entityManagerFactoryBean;
}
_
このBeanはLocalContainerEntityManagerFactoryBean
を取得するためのものです。 hibProperties()
からDataSource
、PersistenceProviderClass
、エンティティパッケージ名PackagesToScan
およびJpaPropertiesを取得します。
_@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
private Properties hibProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
return properties;
}
_
ここで、_env value are comming from application.properties
_。
以下のプロパティを確認します。
_hibernate.dialect: org.hibernate.dialect.Oracle12cDialect
hibernate.show_sql: false
hibernate.hbm2ddl.auto: none
_
主要部分はデータソース設定です。以下が与えられます:
_@Bean
public ComboPooledDataSource dataSource(){
ComboPooledDataSource dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass(env.getProperty("db.driver"));
dataSource.setJdbcUrl(env.getProperty("db.url"));
dataSource.setUser(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
dataSource.setMinPoolSize(Integer.parseInt(env.getProperty("minPoolSize")));
dataSource.setMaxPoolSize(Integer.parseInt(env.getProperty("maxPoolSize")));
dataSource.setMaxIdleTime(Integer.parseInt(env.getProperty("maxIdleTime")));
dataSource.setMaxStatements(Integer.parseInt(env.getProperty("maxStatements")));
dataSource.setMaxStatementsPerConnection(Integer.parseInt(env.getProperty("maxStatementsPerConnection")));
dataSource.setMaxIdleTimeExcessConnections(10000);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
return dataSource;
}
_
MaxPoolSize、MinPoolSize、MaxIdleSizeなど、より多くの重要なパラメーターを使用するComboPooledDataSource
を使用しています。環境パラメーターは以下のとおりです:
_db.driver: Oracle.jdbc.driver.OracleDriver // for Oracle
db.username: YOUR_USER_NAME
db.password: YOUR_USER_PASSWORD
db.url: DATABASE_URL
minPoolSize:5 // number of minimum poolSize
maxPoolSize:100 // number of maximum poolSize
maxIdleTime:5 // In seconds. After that time it will realease the unused connection.
maxStatements:1000
maxStatementsPerConnection:100
maxIdleTimeExcessConnections:10000
_
完全なサンプルコードは次のとおりです:
_import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import Java.beans.PropertyVetoException;
import Java.util.Properties;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
@PropertySource("classpath:application.properties")
@Scope("singleton")
public class TestDataSource {
@Autowired
private Environment env;
@Qualifier("dataSource")
@Autowired
private DataSource dataSource;
@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager =
new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
@Primary
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
entityManagerFactoryBean.setPackagesToScan("YOUR.PACKAGE.NAME");
entityManagerFactoryBean.setJpaProperties(hibProperties());
return entityManagerFactoryBean;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
@Bean
public ComboPooledDataSource dataSource(){
ComboPooledDataSource dataSource = new ComboPooledDataSource();
try {
dataSource.setDriverClass(env.getProperty("db.driver"));
dataSource.setJdbcUrl(env.getProperty("db.url"));
dataSource.setUser(env.getProperty("db.username"));
dataSource.setPassword(env.getProperty("db.password"));
dataSource.setMinPoolSize(Integer.parseInt(env.getProperty("minPoolSize")));
dataSource.setMaxPoolSize(Integer.parseInt(env.getProperty("maxPoolSize")));
dataSource.setMaxIdleTime(Integer.parseInt(env.getProperty("maxIdleTime")));
dataSource.setMaxStatements(Integer.parseInt(env.getProperty("maxStatements")));
dataSource.setMaxStatementsPerConnection(Integer.parseInt(env.getProperty("maxStatementsPerConnection")));
dataSource.setMaxIdleTimeExcessConnections(10000);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
return dataSource;
}
private Properties hibProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
return properties;
}
}
_
もう一つ。ここにgradleリンクがあります
_compile group: 'org.hibernate', name: 'hibernate-c3p0', version: '5.2.10.Final'
_
これがお役に立てば幸いです。ありがとう:)