实体经理超时

时间:2016-02-02 16:00:50

标签: mysql spring spring-data spring-data-jpa connection-timeout

我正在使用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

1 个答案:

答案 0 :(得分:0)

<强> @PersistenceContext

@PersistenceContext
private EntityManager entityManager;

<强>更新

在我看来:这个简短的回答比没有更好,它可以节省我很多时间

link 1

  

没关系,但如何获得EnityManager?   这实际上可能是最酷的部分。基本上你只需要通过添加@PersistenceContext JPA注释来使用Spring就可以完全按照你的方式定义DAO。

link 2 (rus)

  
      
  1. Вбинах,гденеобходимменеджерсущностейпометитьсоответствующееполеаннотацией@ PersistenceContext
  2.   

link 3

  

@PersistenceContext注入容器管理的实例。