В моем процессе Java я подключаюсь к MySQL, используя следующую конфигурацию пружины: < /p>
@Configuration
@EnableTransactionManagement
@PropertySources({ @PropertySource("classpath:/myProperties1.properties"), @PropertySource("classpath:/myProperties2.properties") })
public class MyConfiguration {
@Autowired
protected Environment env;
/**
* @return EntityManagerFactory for use with Hibernate JPA provider
*/
@Bean(destroyMethod = "destroy")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setJpaVendorAdapter(jpaVendorAdapter());
em.setPersistenceUnitManager(persistenceUnitManager());
return em;
}
/**
*
* @return jpaVendorAdapter that works in conjunction with the
* persistence.xml
*/
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(Database.valueOf(env.getProperty("jpa.database")));
vendorAdapter.setDatabasePlatform(env.getProperty("jpa.dialect"));
vendorAdapter.setGenerateDdl(env.getProperty("jpa.generateDdl", Boolean.class, false));
vendorAdapter.setShowSql(env.getProperty("jpa.showSql", Boolean.class, false));
return vendorAdapter;
}
@Bean
public PersistenceUnitManager persistenceUnitManager() {
DefaultPersistenceUnitManager pum = new DefaultPersistenceUnitManager();
pum.setPackagesToScan("com.app.dal");
pum.setDefaultPersistenceUnitName("my-pu");
pum.setPersistenceXmlLocations("classpath:/META-INF/persistence.xml");
pum.setDefaultDataSource(dataSource());
return pum;
}
@Bean(destroyMethod = "close")
public DataSource dataSource() {
Properties dsProps = new Properties();
dsProps.put("driverClassName", env.getProperty("hikari.driverClassName"));
dsProps.put("username", env.getProperty("hikari.username"));
dsProps.put("password", env.getProperty("hikari.password"));
dsProps.put("jdbcUrl", env.getProperty("hikari.source.data.jdbcUrl"));
dsProps.put("connectionTimeout", env.getProperty("hikari.connectionTimeout", Integer.class));
dsProps.put("idleTimeout", env.getProperty("hikari.idleTimeout", Integer.class));
dsProps.put("maxLifetime", env.getProperty("hikari.maxLifetime", Integer.class));
dsProps.put("maximumPoolSize", env.getProperty("hikari.maximumPoolSize.rtb.source", Integer.class));
dsProps.put("leakDetectionThreshold", env.getProperty("hikari.leakDetectionThreshold", Integer.class));
dsProps.put("jdbc4ConnectionTest", env.getProperty("hikari.jdbc4ConnectionTest", Boolean.class));
HikariConfig config = new HikariConfig(dsProps);
HikariDataSource ds = new HikariDataSource(config);
return ds;
}
@Bean(name = "sourceTxMgr")
public PlatformTransactionManager sourceDatatransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setPersistenceUnitName("my-pu");
transactionManager.setDataSource(dataSource());
return transactionManager;
}
@Bean
public PersistencyManager persistencyManager() {
return new JpaPersistencyManager();
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
< /code>
intity-manager вводится в уровень доступа к данным контейнером: < /p>
@PersistenceContext(type = PersistenceContextType.TRANSACTION, unitName = "my-pu")
private EntityManager myEntityManager;
< /code>
и мои методы публичной бизнес-логики аннотированы с аннотацией @TransActionAl < /code>. удалось. Может ли кто -нибудь объяснить это мне или дать хорошую ссылку, которая может объяснить, когда именно соединения возвращаются в пул при использовании такой настройки? Не единственный компонент, необходимый для выполнения декларативной работы по управлению транзакциями. На самом деле необходимы три отдельных компонента: < /p>
Сам прокси -сервер EntityManager
Транзакционный аспект
менеджер транзакций
let's ware Over и посмотрите, как они взаимодействуют. < /P>
Аспект «Обегает», который общий аспект «Обегает». и после аннотированного бизнес -метода. Конкретный класс для реализации этого аспекта - это транзакция. />
В момент «после» аспект должен решить, должна ли транзакция быть совершена, откатана или остается влево. />
Диспетчер транзакций должен дать ответ на два вопроса: < /p>
Должен ли новый менеджер объектов? The transaction manager will decide based on:
the fact that one transaction is already ongoing or not
the propagation attribute of the transactional method (for example REQUIRES_NEW always starts a new transaction)
If the transaction manager decides to create a new transaction, then it will:
create a new entity manager
bind the entity manager С текущим потоком
Grave соединение из пула соединений DB
Привяжите соединение с текущим потоком
Manager и подключение и соединение связаны с текущим потоком, используя трентокальные переменные. Части программы, которые нуждаются в текущем менеджере объектов или подключении, могут извлечь их из потока. Один компонент программы, который делает именно то, что является доверенным лицом EntityManager.
Подробнее здесь: https://stackoverflow.com/questions/274 ... -hibernate
Когда соединения возвращаются в пул соединений с помощью менеджера сущностей Spring JPA (Hibernate)? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему пул соединений R2DBC выделяет MAX соединений, когда они не нужны приложению
Anonymous » » в форуме JAVA - 0 Ответы
- 28 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему пул соединений R2DBC выделяет MAX соединений, когда они не нужны приложению
Anonymous » » в форуме JAVA - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему пул соединений R2DBC выделяет MAX соединений, когда они не нужны приложению
Anonymous » » в форуме JAVA - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Spring Boot - данные иерархических сущностей не возвращаются из API отдыха
Anonymous » » в форуме JAVA - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-