1
我正在使用Spring Data,但對於自定義查詢我想開始使用EntityManager。 問題是除了使用EntityManager查詢外,所有使用Spring Data的查詢都可以正常工作。 EntityManager查詢所有時間都有超時錯誤。實體管理器超時
@Bean
public BasicDataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl(MessageFormat.format(Constants.DATABASE_CONNECTION_URL, host, port, schema));
ds.setUsername(username);
ds.setPassword(password);
ds.setTestWhileIdle(true);
ds.setValidationQuery(validationQuery);
ds.setTimeBetweenEvictionRunsMillis(validationTestInterval);
return ds;
}
@Bean
public EntityManager entityManager() {
return entityManagerFactory(dataSource()).createEntityManager();
}
@Bean
public EntityManagerFactory entityManagerFactory(BasicDataSource dataSource) {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
vendorAdapter.setShowSql(false);
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
vendorAdapter.setDatabase(Database.MYSQL);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan(
"com.xxx"
);
Properties properties = new Properties();
properties.setProperty("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
properties.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
properties.setProperty("hibernate.connection.url", MessageFormat.format(Constants.DATABASE_CONNECTION_URL, host, port, schema));
properties.setProperty("hibernate.connection.username", username);
properties.setProperty("hibernate.connection.password", password);
properties.setProperty("hibernate.c3p0.acquire_increment", "5");
properties.setProperty("hibernate.c3p0.idle_test_period", "300");
properties.setProperty("hibernate.c3p0.min_size", "5");
properties.setProperty("hibernate.c3p0.timeout", "1000");
factory.setJpaProperties(properties);
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
JpaDialect jpaDialect = new HibernateJpaDialect();
txManager.setEntityManagerFactory(entityManagerFactory);
txManager.setJpaDialect(jpaDialect);
txManager.setDefaultTimeout(60000);
txManager.setRollbackOnCommitFailure(true);
return txManager;
}
@Component
public class ReportGenerator {
@Autowired
private EntityManager entityManager;
private List<MyObject> doSomething() {
StringBuilder sql = new StringBuilder();
// build query
List<MyObject> list = entityManager.createNativeQuery(sql.toString(), MyObject.class).getResultList();
entityManager.clear();
return list;
}
有什麼建議嗎?
更新1:
validationQuery = SELECT 1;
validationTestInterval = 30000
你能提供更多的細節嗎?這是如何回答這個問題的?這似乎不是很有用,因爲...... – Krease
@Chris,不幸的是我現在沒有時間對這個問題進行深入調查,因爲衝刺結束等等,但我會盡量在以後做。這就是爲什麼這個答案的原因 - 在原始文章中使用entityManager使用的例子是@PersistenceContext註釋。所以最初的問題是我糟糕的複製粘貼。在任何更改@ Autowired - > @ PersistenceContext將解決該問題。查看我的更新以獲得答案,但對於@ Autowired情況下的行爲我仍然不知情。 – Alex