- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个使用 Spring 和 jOOQ 的网络应用。
考虑以下用例:
我打开呈现数据库查询结果的 URL:select * from contract_ref
,一切正常。
我打开 URL,它试图运行触发 Postgres 错误的查询,即 select * from users_ref
(表 users_ref 不存在),并得到错误:
Servlet.service() for servlet [dispatcher] in context with path [/astra] throw exception [请求处理失败;嵌套异常是 org.springframework.jdbc.BadSqlGrammarException: jOOQ;错误的 SQL 语法 [select * from "users_ref"];嵌套异常是 org.postgresql.util.PSQLException: ОШИБКА: отношение "users_ref"не существует
。
当我尝试从第 1 步打开页面时,出现错误 PSQLException: current transaction is aborted, commands ignored until end of transaction block
,但我看到 webapp 尝试执行第 1 步的声明。
在我看来,情况就像 Postgres 没有关闭事务,但我只做了 select
,所以不需要任何事务。
当我为 ReferenceController.view
添加 @Transactional
注释时,上述行为就会消失。
完整日志:http://pastebin.com/t3UmbeCy
应用程序上下文.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:bean="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<cache:annotation-driven/>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<context:component-scan base-package="net.kerba"/>
<context:property-placeholder location="classpath:config.properties"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="localDbDataSource"/>
</bean>
<bean id="jacksonMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
<bean:annotation-driven>
<bean:message-converters>
<ref bean="jacksonMessageConverter"/>
</bean:message-converters>
</bean:annotation-driven>
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean">
<property name="name" value="user-page"/>
</bean>
</set>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
<property name="requestContextAttribute" value="requestContext"/>
<property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
</bean>
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.NullPointerException">exception</prop> <!-- map exception to view name -->
<prop key="org.springframework.jdbc.UncategorizedSQLException">exception</prop> <!-- map exception to view name -->
</props>
</property>
</bean>
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles/tiles-common.xml</value>
<value>/WEB-INF/tiles/tiles-admin.xml</value>
<value>/WEB-INF/tiles/tiles-requests.xml</value>
</list>
</property>
<property name="preparerFactoryClass"
value="org.springframework.web.servlet.view.tiles3.SpringBeanPreparerFactory"/>
</bean>
<bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">
<property name="dropFirst" value="true"/>
<property name="dataSource" ref="localDbDataSource"/>
<property name="changeLog" value="classpath:db.astra.index.xml"/>
</bean>
<bean id="localDbDataSource"
class="org.apache.tomcat.jdbc.pool.DataSource">
<property name="driverClassName" value="${db.driverClassName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="maxIdle" value="${db.maxIdle}"/>
<property name="minIdle" value="${db.minIdle}"/>
<property name="maxActive" value="${db.maxActive}"/>
<property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}"/>
<property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"/>
<property name="testWhileIdle" value="${db.testWhileIdle}"/>
<property name="validationQuery" value="${db.validationQuery}"/>
<property name="removeAbandoned" value="${db.removeAbandoned}"/>
<property name="logAbandoned" value="${db.logAbandoned}"/>
<property name="initialSize" value="${db.initialSize}"/>
<property name="defaultAutoCommit" value="false" />
</bean>
<bean id="transactionAwareDataSource"
class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
<constructor-arg ref="localDbDataSource"/>
</bean>
<bean class="org.jooq.impl.DataSourceConnectionProvider" name="connectionProvider">
<constructor-arg ref="transactionAwareDataSource"/>
</bean>
<bean id="exceptionTranslator"
class="net.kerba.astra.exception.SpringExceptionTranslator"/>
<bean class="org.jooq.impl.DefaultConfiguration" name="jooqConfig">
<constructor-arg index="0" ref="connectionProvider"/>
<constructor-arg index="1">
<null/>
</constructor-arg>
<constructor-arg index="2">
<null/>
</constructor-arg>
<constructor-arg index="3">
<list>
<bean class="org.jooq.impl.DefaultExecuteListenerProvider">
<constructor-arg index="0" ref="exceptionTranslator"/>
</bean>
</list>
</constructor-arg>
<constructor-arg index="4">
<null/>
</constructor-arg>
<constructor-arg index="5">
<value type="org.jooq.SQLDialect">POSTGRES</value>
</constructor-arg>
<constructor-arg index="6">
<null/>
</constructor-arg>
<constructor-arg index="7">
<null/>
</constructor-arg>
</bean>
<bean id="dsl" class="org.jooq.impl.DefaultDSLContext">
<constructor-arg ref="jooqConfig"/>
</bean>
<bean id="patientDao" class="net.kerba.astra.jooq.tables.daos.PatientDao">
<property name="configuration" ref="jooqConfig" />
</bean>
<bean id="patientStatusDao" class="net.kerba.astra.jooq.tables.daos.PatientStatusRefDao">
<property name="configuration" ref="jooqConfig" />
</bean>
<bean id="requestUrgencyRefDao" class="net.kerba.astra.jooq.tables.daos.RequestUrgencyRefDao">
<property name="configuration" ref="jooqConfig" />
</bean>
<bean id="divisionRefDao" class="net.kerba.astra.jooq.tables.daos.DivisionRefDao">
<property name="configuration" ref="jooqConfig" />
</bean>
<bean id="requestStateRefDao" class="net.kerba.astra.jooq.tables.daos.RequestStateRefDao">
<property name="configuration" ref="jooqConfig" />
</bean>
</beans>
引用 Controller :
package net.kerba.astra.controller;
@Controller
@RequestMapping("references")
public class ReferencesController {
private static final Logger logger = LoggerFactory.getLogger(ReferencesController.class);
@Autowired
private ReferenceService referenceService;
@Autowired
private DSLContext dsl;
private static final Map<String,Object> REFERENCES_CONFIG = loadReferencesList();
private static Map<String,Object> loadReferencesList() {
final InputStream resourceAsStream = ReferencesController.class.getResourceAsStream("ReferencesController.data.json");
Objects.requireNonNull(resourceAsStream, "resourceAsStream must not be null");
final InputStreamReader json;
try {
json = new InputStreamReader(resourceAsStream, "utf8");
Objects.requireNonNull(json, "json must not be null");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Encoding not supported: utf8", e);
}
final Map map = new Gson().fromJson(json, Map.class);
Objects.requireNonNull(map, "map must not be null");
SortedMap<String,Object> sortedMap = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
String key1 = (String) o1;
String key2 = (String) o2;
if (key1 != null && key2 != null) {
return key1.compareTo(key2);
} else {
return 0;
}
}
});
sortedMap.putAll(map);
return sortedMap;
}
/**
* Индексная страница справочников
* @param model
* @return
*/
@RequestMapping(value = "", method = RequestMethod.GET)
public String index(Model model) {
model.addAttribute("referencesConfig", REFERENCES_CONFIG);
model.addAttribute("pageTitle", "Справочники");
return "references.index";
}
@RequestMapping(value = "view/{referenceName}", method = RequestMethod.GET)
public String view(Model model,@PathVariable("referenceName") String referenceName) {
model.addAttribute("referencesConfig", REFERENCES_CONFIG);
if (!REFERENCES_CONFIG.containsKey(referenceName)) {
model.addAttribute("pageTitle", "Справочник не найден");
model.addAttribute("message", "Справочник не найден!");
return "error";
} else {
final Map currentRef = (Map) REFERENCES_CONFIG.get(referenceName);
model.addAttribute("pageTitle", "Справочник: «" + currentRef.get("name") + "»");
model.addAttribute("selectedReferenceConfig", currentRef);
model.addAttribute("selectedReferenceConfigKey", referenceName);
SelectQuery selectQuery = dsl.selectQuery();
final String tableName = currentRef.get("tableName").toString();
Objects.requireNonNull(tableName, "tableName must not be null");
selectQuery.addFrom(DSL.tableByName(tableName));
final Result result = selectQuery.fetch();
logger.info("result: {}", result.intoMaps());
model.addAttribute("referenceData", result.intoMaps());
return "references.index";
}
}
}
最佳答案
事务总是存在于 Postgres 中。有多种选项可以控制它们,例如显式事务(纯SQL中的BEGIN
-END
block )与隐式交易,其中未声明但隐含交易。
还有 autocommit,它会在每个语句之后为您自动结束事务——即如果成功则为 COMMIT
,否则为 ROLLBACK
。这不允许在同一事务下执行多个单独的命令,但这通常是可取的。
jOOQ 根本不管理事务,并遵从现有的方法来管理它们(Spring TransactionAwareDataSourceProxy
在您的例子中)。添加 @Transactional
为 Spring 定义事务的属性(您可以执行诸如设置隔离级别等操作)。 p>
因此,如果您使用该注释获得预期的行为,我认为这很好并且可以预料,因为正如我上面提到的,Postgres 始终是事务性的。如果没有该注释,Spring 不会将与 Postgres 的交互视为事务性的,即使在 Postgres 级别它是事务性的,因此您会得到诸如尝试的行为对中止的事务进行额外的查询,从而导致异常。
关于java - jOOQ + Spring : PSQLException: current transaction is aborted, 命令被忽略直到事务结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25951491/
我有一个 jQuery 日期选择器。我想将默认日期设置为“当前月份、当前日期(当前年份-18)”,但在设置 defaultDate 属性时遇到问题。显示的默认年份是 1920 年,据说是 1995 年
我有下面的 C 程序来实现升序链表。问题出在 buildList() 函数中,因此您可以忽略除 main() 和 buildList() 之外的其他函数。 #include #include stru
嗯,想象一下 current.txt 文件: asdf base.txt 文件: asdf 其他.txt文件: asdf 当我进行三向 merge 时 git merge-file current.t
我试图在鼠标悬停时生成一个 :after 伪元素。例如: .email{ width:100px; overflow:hidden; text-overflow:ellipsi
为什么 $('a.current').removeClass('current'); 不适用于此 jquery 选项卡? http://jsfiddle.net/laukstein/ytnw9/8/
我正在创建一个应用程序(Outlook 的 Office 加载项) 我遇到的问题是更新我的屏幕。我知道我需要调用 Dispatcher,但是它在我的 ViewModel 中始终为 null p
我为客户开发网络和移动应用程序。在我当前的架构中,许多资源在 Web 访问和移动访问之间共享。 aspx 页面可以显示在网络上,也可以在移动应用程序中调用 WebView 。我的问题是: WebOpe
我通过调用 IEnumerable.GetEnumerator() 得到了一个枚举器,然后我称它为MoveNext()直到它返回false,然后访问它的Current属性(property)。令我惊讶
我正在尝试动态查找当前运行的函数(此函数)的名称,即 (defun my-func () (remove-hook 'some-hook this-function) (do-
阅读了短语 "The current SynchronizationContext is a property of the current thread" correct" ,我有点懵了…… 在 V
集成 IOS STRIPE TERMINAL SDK对于BBPOS Chipper 2X BT使用 swift 。我们已经开发并测试了该系统,并且运行良好。但是当我们将它交给其他国家的客户时,他们收到
当我在训练期间编写的类上实现 IEnumerable 和 IEnumerator 时,我注意到我需要为属性“Current”指定两个实现。 public class PeopleEnumerator
我原以为对实现了 IEnumerable 的空集合执行以下代码会抛出异常: var enumerator = collection.GetEnumerator(); enumerator.MoveNe
应Application.Current.Shutdown()不用作关闭 WPF 应用程序的最佳实践? 我有一个小的多窗口应用程序,“关机”似乎对我所有的退出命令都很好。但是,我被告知要始终使用 Ap
在 XPath 1.0 中,有一个函数 current() 可以派上用场,当我根据我当时所在的节点引用 XML 中其他地方的节点时。我的 XML 具有如下结构:
在 MVC 中,这两者有什么区别? 它们看起来相同,甚至返回相同的类型/类System.Web.Security.RolePrincipal,但有一些微妙之处。 例如。当针对通过 ClaimsPrin
这个问题在这里已经有了答案: What is the difference between an App and Application in c#.net? (1 个回答) 关闭 7 年前。 这两
我正在为我的团队开发一个代码生成器 (VSIX),在我与 VSIX 可扩展性框架作斗争之后,我打算使用 Roslyn 作为基础引擎。 我的代码生成器目前能够为解决方案生成一个新的 csproj,并且能
为什么 $('a.current').parent('li').addClass('current'); 和 $(this).hasClass('current')。 parent('li').add
当我使用 Xcode 调试我的 iOS 程序时,gdb 将其显示在控制台 View 上,并且没有发生任何错误。 我只想知道输出“Current language: auto; currently ob
我是一名优秀的程序员,十分优秀!