为啥会整这段代码。。。头痛。。。
因为我的项目中c3p0.*在数据库存储且为所有模块公用数据,但是这个存储中的minPoolSize和maxPoolSize不满足我当前的模块使用,需要建立一个更大连接数的Pool。但是又不能修改这两个值,否则全局所有模块都会建立一个大的连接数的Pool,所有模块这样会将DB的connection撑爆。
之前用的mybatis,第一次用hibernate,总结一下。
dataSource,mybatis和hibernate都一样,mybatis中需要创建的sqlSessionFactory,hibernate需要创建的是entityManagerFactory
1.创建DataSource的bean
@Configuration
@ComponentScan
@RefreshScope
public class SecondaryC3p0DataSource {
@Value("${c3p0.user}")
private String user;
@Value("${c3p0.unreturnedConnectionTimeout}")
private Integer unreturnedConnectionTimeout;
@Value("${c3p0.testConnectionOnCheckout}")
private Boolean testConnectionOnCheckout;
@Value("${c3p0.password}")
private String password;
@Value("${c3p0.maxStatements}")
private Integer maxStatements;
@Value("${c3p0.maxIdleTime}")
private Integer maxIdleTime;
@Value("${c3p0.jdbcUrl}")
private String jdbcUrl;
@Value("${c3p0.initialPoolSize}")
private Integer initialPoolSize;
@Value("${c3p0.idleConnectionTestPeriod}")
private Integer idleConnectionTestPreiod;
@Value("${c3p0.driverClass}")
private String driverClass;
@Value("${c3p0.debugUnreturnedConnectionStackTraces}")
private Boolean debugUnreturnedConnectionStackTraces;
@Value("${c3p0.checkoutTimeout}")
private Integer checkoutTimeout;
@Value("${c3p0.minPoolSize}")
private Integer minPoolSize;
@Value("${c3p0.maxPoolSize}")
private Integer maxPoolSize;
@Value("${c3p0.breakAfterAcquireFailure}")
private Boolean breakAfterAcquireFailure;
@Value("${c3p0.acquireRetryDelay}")
private Integer acquireRetryDelay;
@Value("${c3p0.acquireRetryAttempts}")
private Integer acquireRetryAttempts;
@Value("${c3p0.acquireIncrement}")
private Integer acquireIncrement;
@Bean(name="mykDataSource")
@Qualifier("myDataSource")
public DataSource iflytekC3p0DataSource() {
ComboPooledDataSource dataSource=new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setUnreturnedConnectionTimeout(unreturnedConnectionTimeout);
dataSource.setTestConnectionOnCheckout(testConnectionOnCheckout);
dataSource.setPassword(password);
dataSource.setMaxStatements(maxStatements);
dataSource.setMaxIdleTime(maxIdleTime);
dataSource.setJdbcUrl(jdbcUrl);
dataSource.setIdleConnectionTestPeriod(idleConnectionTestPreiod);
try {
dataSource.setDriverClass(driverClass);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
dataSource.setDebugUnreturnedConnectionStackTraces(debugUnreturnedConnectionStackTraces);
dataSource.setCheckoutTimeout(checkoutTimeout);
dataSource.setBreakAfterAcquireFailure(breakAfterAcquireFailure);
dataSource.setAcquireRetryAttempts(acquireRetryAttempts);
dataSource.setAcquireIncrement(acquireIncrement);
dataSource.setMaxPoolSize(800);
dataSource.setMinPoolSize(10);
dataSource.setInitialPoolSize(10);
return dataSource;
}
}
2.创建C3P0的entityManager,entityMaagerFactory,transactionManager,jdbcTemplate等
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager",
basePackages = {"com.ink.snow.*"}//repository所在位置
)
public class MyC3p0Config {
@Autowired
@Qualifier("myDataSource")
private DataSource dataSource;
@Autowired
private JpaProperties jpaProperties;
@Bean(name = "entityManager")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryIflytek(builder).getObject().createEntityManager();
}
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryIflytek(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(dataSource)
.properties(getVendorProperties())
.packages("com.ink.snow.*") //设置实体类所在位置
.persistenceUnit("iflytekPersistenceUnit")
.build();
}
private Map<String, Object> getVendorProperties() {
Map<String, Object> ret = jpaProperties.getHibernateProperties(new HibernateSettings());
ret.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
return ret;
}
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryIflytek(builder).getObject());
}
@Bean(name = "myJdbcTemplate")
public JdbcTemplate iflytekJdbcTemplate(){
return new JdbcTemplate(dataSource);
}
}