我在这里有一个基于Spring MVC的应用程序.我的同事(顺便说一句,他不在这里)以编程方式配置它,除了TransactionManager之外,一切似乎都有效.我从未配置过像这样的Spring Web应用程序,我也不知道该做什么,也找不到任何关于如何配置这样的web应用程序的文档.
我只会告诉你'AppInitializer'和'EntityManagerConfig'.
AppInitializer:
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context;
ServletRegistration.Dynamic dispatcherServletRegistration;
FilterRegistration.Dynamic encodingFilterRegistration, compressionFilterRegistration;
Set<SessionTrackingMode> sessionTrackingModes = new HashSet<SessionTrackingMode>();
sessionTrackingModes.add(SessionTrackingMode.SSL);
context = new AnnotationConfigWebApplicationContext();
context.setServletContext(servletContext);
context.scan("de.devbliss.doc");
servletContext.addListener(new ContextLoaderListener(context));
servletContext.addListener(new Log4jConfigListener());
dispatcherServletRegistration = servletContext.addServlet("main", new DispatcherServlet(context));
dispatcherServletRegistration.setLoadOnStartup(1);
dispatcherServletRegistration.addMapping("/*");
encodingFilterRegistration = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
encodingFilterRegistration.setInitParameter("encoding", "UTF-8");
encodingFilterRegistration.setInitParameter("forceEncoding", "true");
encodingFilterRegistration.addMappingForUrlPatterns(null, false, "/*");
compressionFilterRegistration = servletContext.addFilter("compressionFilter", GzipFilter.class);
compressionFilterRegistration.addMappingForUrlPatterns(null, false, "/*");
compressionFilterRegistration = servletContext.addFilter("springSecurityFilterChain",
DelegatingFilterProxy.class);
compressionFilterRegistration.addMappingForUrlPatterns(null, false, "/*");
servletContext.setSessionTrackingModes(sessionTrackingModes);
}
}
Run Code Online (Sandbox Code Playgroud)
EntityManagerConfig:
@Configuration
@PropertySource("classpath:/db.properties") …Run Code Online (Sandbox Code Playgroud) 阅读Spring事务文档时,我发现它支持全局事务和本地事务.
如果我使用以下配置 - 它是否意味着它是本地事务?
<tx:annotation-driven transaction-manager="transManager" />
<bean id="transManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emf" />
</bean>
Run Code Online (Sandbox Code Playgroud)
我尝试在Google和Stackoverflow中搜索,但没有得到任何资源解释相同的简单术语.
java spring transactions distributed-transactions spring-transactions
我需要管理我的应用程序中的多个资源,如jms和数据库
在查看可以管理多个资源的事务管理器时,我遇到了两个事务管理器JtaTransactionManager和ChainedTransactionManager,它们几乎声称可以管理多个资源.
任何人都可以解释它们的主要区别吗?什么时候应该使用哪一个?
我正在使用我的项目<version.org.aspecj>1.7.4</version.org.aspecj>和<vesrion.org.springframework>4.0.1.RELEASE</vesrion.org.springframework>版本.最近我将这两个版本升级到 <version.org.aspectj>1.8.9</version.org.aspectj>和
<version.org.springframework>4.3.11.RELEASE</version.org.springframework>.
我在我的项目中使用JPA存储库,当我尝试保存任何对象时,我收到的错误如"JTA EntityManager无法使用getTransaction()".
下面是我的persistence.xml和其他配置.请求您查看这些配置并分享您的输入.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="appPersistenceUnit"
transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/appDS</jta-data-source>
<!-- entities -->
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="jboss.entity.manager.factory.jndi.name"
value="persistence-units/fusePersistenceUnit"/>
<property name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/>
<property name="hibernate.connection.autocommit" value="false"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
<property name="hibernate.current_session_context_class"
value="jta"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
<property name="hibernate.format_sql" value="false"/>
<property name="hibernate.generate_statistics" value="false"/>
<property name="hibernate.hbm2ddl.auto" value="validate"/>
<property name="hibernate.jdbc.batch_size" value="40"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.search.default.directory_provider" value="filesystem" />
<property name="hibernate.connection.url" …Run Code Online (Sandbox Code Playgroud) 为什么 SpringChainedTransactionManager被弃用了?Spring 是否提供任何替代库来支持多个事务管理器?
我的用例:- 我们正在构建一个连接到两个数据源(db1 和 db2)的 Spring Boot 应用程序,它对两个数据库(db1 和 db2)执行插入操作。我们的要求是这样的:插入 -> DB1 -> 成功插入 -> DB2 -> 错误回滚 DB1
目前,我们正在使用ChaninedTransactionManager并且它按预期工作,但我可以看到 lib 已被弃用。那么,只是想确保使用它是否安全,或者 Spring 是否提供了任何我们可以用来替代它的替代库?
原始问题的概要:使用带有AOP代理的标准Spring事务,不可能从同一类中的非@Transactional-marked方法调用@ Transactional-marked方法并且在事务内(特别是由于前面提到的)代理).据说在AspectJ模式下使用Spring Transactions可以实现这一点,但它是如何完成的?
编辑:使用加载时编织的AspectJ模式中Spring事务的完整纲要:
将以下内容添加到META-INF/spring/applicationContext.xml:
<tx:annotation-driven mode="aspectj" />
<context:load-time-weaver />
Run Code Online (Sandbox Code Playgroud)
(我假设您已经在应用程序上下文中设置了一个AnnotationSessionFactoryBean和一个HibernateTransactionManager设置.您可以将标签添加transaction-manager="transactionManager"为属性<tx:annotation-driven />,但如果事务管理器bean的id属性值实际上是" transactionManager",则它是多余的,因为" transactionManager"是该属性的默认值.)
添加META-INF/aop.xml.内容如下:
<aspectj>
<aspects>
<aspect name="org.springframework.transaction.aspectj.AnnotationTransactionAspect" />
</aspects>
<weaver>
<include within="my.package..*" /><!--Whatever your package space is.-->
</weaver>
</aspectj>
Run Code Online (Sandbox Code Playgroud)
添加aspectjweaver-1.7.0.jar和spring-aspects-3.1.2.RELEASE.jar你的classpath.我使用Maven作为我的构建工具,所以这里是<dependency />项目POM.xml文件的声明:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
spring-instrument-3.1.2.RELEASE.jar不需要作为<dependency />你的classpath,但你仍然需要它在 …
这是关于Spring 在服务层OpenSessionInViewFilter使用 @Transactional注释.
我经历了这么多的堆栈溢出帖子,但仍然困惑我是否应该使用OpenSessionInViewFilter或不避免LazyInitializationException
如果有人帮我找到以下查询的答案将是很大的帮助.
OpenSessionInViewFilter在具有复杂模式的应用程序中使用是不好的做法.N+1问题OpenSessionInViewFilter它是否意味着@Transactional不需要?下面是我的Spring配置文件
<context:component-scan base-package="com.test"/>
<context:annotation-config/>
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="resources/messages" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<!--
<prop key="hibernate.hbm2ddl.auto">create</prop>
-->
</props>
</property>
</bean> …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用spring和hibernate并使用spring事务.
所以我在方法和带有数据库查询方法的DAO层上有注释@transaction的服务层.
@Transactional(readOnly = false)
public void get(){
}
Run Code Online (Sandbox Code Playgroud)
问题是当我想在数据库中保存一个对象时,我必须@Transaction在DAO层方法结束时使用.为什么?
我想如果我有注释@ transaction,那么spring应该在完成服务方法时自动提交事务.
DAO层:
public BaseEntity saveEntity(BaseEntity entity) throws Exception {
try {
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(entity);
session.flush();
} catch (HibernateException he) {
throw new Exception("Failed to save entity " + entity);
}
return entity;
}
Run Code Online (Sandbox Code Playgroud)
服务层:
@Transactional(readOnly = false)
public BaseEntity saveEntity(BaseEntity entity) throws Exception {
return dao.saveEntity(entity);
}
Run Code Online (Sandbox Code Playgroud)
弹簧配置:
<context:property-placeholder properties-ref="deployProperties" />
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- Activate Spring Data JPA repository support -->
<jpa:repositories base-package="com" /> …Run Code Online (Sandbox Code Playgroud) 我仍然试图围绕@Transactional 的工作原理进行思考。
我@Transactional对 Service 类的方法进行了@Modifying注释,对 Repository 类中的方法进行了注释。带@Transactional注释的方法是否适用于带注释的 Repository 中的方法@Modifying?
我的理解:
@Transactional在@Transactional( readOnly = true )没有数据的类的方法上写入数据库,而在使用 时@Transactional,数据写入数据库。
修改查询
- 修改方法签名只能返回
void,Integer或者int- 更新查询必须是事务性的,标记为
@Transactional- Spring Data 将删除所有未刷新的更改
EntityManager,更改为@Modifying(clearAutomatically=false)
正如第二点所说的@Modifying查询必须有@Transactional(readOnly=false),所以我们可以在@Service方法调用@Repository级别或方法级别调用中添加它。如果在@Service级别添加它也适用于@Respository从@Service级别方法调用中调用的方法?
例子:
@Service
class AnimalServiceImpl implements AnimalService {
@Autowire
AnimalRepository animalRepository;
@Override
@Transactional
public void persistAnimal() {
....
animalRepository.save();
}
@Override
@Transactional(readOnly …Run Code Online (Sandbox Code Playgroud) 我的应用程序应该有2个核心端点:push,pull for sending和fetching data.
拉操作应该异步工作并产生DeferredResult.当用户通过休息调用pull service时,会创建新的DefferedResult并将其存储到Map<Long, DefferedResult> results = new ConcurrentHashMap<>()等待新数据的位置或直到超时到期.
推送操作也会呼叫用户过度休息,此操作会检查此操作所推送的数据接收者的结果映射.当map包含收件人的结果时,这些数据被设置为他的结果,返回DefferedResult.
这是基本代码:
@Service
public class FooServiceImpl {
Map<Long, DefferedResult> results = new ConcurrentHashMap<>();
@Transactional
@Override
public DeferredResult<String> pull(Long userId) {
// here is database call, String data = fooRepository.getNewData(); where I check if there are some new data in database, and if there are, just return it, if not add deferred result into collection to wait for it
DeferredResult<String> newResult = new DeferredResult<>(5000L);
results.putIfAbsent(userId, …Run Code Online (Sandbox Code Playgroud) java ×9
spring ×7
hibernate ×4
transactions ×3
spring-boot ×2
spring-data ×2
aop ×1
jta ×1
spring-aop ×1
spring-async ×1
spring-mvc ×1