JDBC事务 - Tomcat 7.0和vFabric tc的区别

时间:2014-01-01 22:45:49

标签: java tomcat servlets jdbc

每个人

我正在研究一些具有对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"/>

两台服务器完全一样。

0 个答案:

没有答案