每个人
我正在研究一些具有对PostgreSQL DB的JDBC访问权限的Java servlet。应用程序使用DataSource定义为服务器上下文中的资源。 DataSource将自动提交属性设置为“false” - 我正在管理来自servlet的事务。
在应用程序中,我有以下代码:
String query =
"insert into auth_selling_permissions "
+ "(selling_permissions_key, "
+ "sell "
+ ") values ( "
+ " DEFAULT, "
+ PermissionLevel.getIntegerValue(org.getSell())+") "
+ " returning selling_permissions_key";
List<Map<String,Object>> list = this.template.queryForList(query);
Integer outKey = (Integer)list.get(0).get("selling_permissions_key");
在同一交易中,我正在执行以下操作:
for(Map<String,Object> prod : listProducts){
Integer k = (Integer)prod.get("type_key");
keysSection+="("+outKey+", "+k+"),";
}
if(keysSection.length()>0){
keysSection = keysSection.substring(0, keysSection.length()-1);
String bindingQuery = "insert into auth_selling_products_permissions (selling_permissions_key, type_key) values "+keysSection;
this.template.update(bindingQuery);
}
上面的代码是为了向selling_permission表插入一行,获取新生成的密钥,并使用它填充相关表(使用sell_permission_key作为FK)。 正如我所提到的,所有这些都是在单笔交易中完成的。
问题是:我正在使用vFabric tc服务器进行开发STS。在开发环境中它很有效。但生产环境。使用Tomcat 7.0。当我在Tomcat 7上运行我的servlet时(使用相同的数据库服务器,相同的JDBC驱动程序和相同的db资源定义) - 它失败了。它给了我org.springframework.dao.DataIntegrityViolationException,并告诉我在auth_selling_permissions中不存在我试图插入auth_selling_products_permissions的密钥。
我很确定问题出在服务器级别。但我现在已经知道Tomcat为什么会这样,我应该检查/配置/更改它以使其作为我的开发服务器。
编辑:
资源定义:
<Resource name="jdbc/calc_webapp" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="dbuser" password="password" driverClassName="org.postgresql.Driver" url="jdbc:postgresql://localhost:5432/prod_db" defaultAutoCommit = "false"/>
两台服务器完全一样。