我的 executeUpdate() 工作,但没有提交

Posted

技术标签:

【中文标题】我的 executeUpdate() 工作,但没有提交【英文标题】:My executeUpdate() working, but not commit 【发布时间】:2015-11-04 05:51:07 【问题描述】:

我试图在我的 postgresql 数据库中插入数据,但是,当我执行 executeUpdate() 方法时,它不会在我的数据库中插入任何数据,而且我看不到我做错了什么......

Ps:我的数据库是 autocommit: on;

我在这里使用 Jboss 7.1.1 我的数据源配置:

<subsystem xmlns="urn:jboss:domain:datasources:1.0">
            <datasources>
                <datasource jta="true" jndi-name="java:jboss/datasources/PostgresqlDS" pool-name="PostgreDS" enabled="true" use-java-context="true" use-ccm="true">
                    <connection-url>jdbc:postgresql://dataBaseAddress/dataBaseName</connection-url>
                    <driver>org.postgresql</driver>
                    <pool>
                        <min-pool-size>2</min-pool-size>
                        <max-pool-size>20</max-pool-size>
                    </pool>
                    <security>
                        <user-name>user</user-name>
                        <password>password</password>
                    </security>
                </datasource>
                <drivers>
                    <driver name="org.postgresql" module="org.postgresql">
                        <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
                    </driver>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>

这是我的连接类:

public Connection getConnection() throws TopLevelException, SQLException 
        Connection conn = null;
        try 
              Context ctx = new InitialContext();
              TransactionBean tal = (TransactionBean) ctx.lookup("java:global/snrng-ear/snrng-ejb-lgc/TransactionBean!br.com.compplied.snrng.ejb.TransactionBean");
              conn = tal.getConnection();
           catch (NamingException e) 
              throw new TopLevelException(e);
          
          return conn;
    

这是执行我的插入的方法

public int inserirHistorico(RetornoHistoricoObject retorno) throws TopLevelException 
        int update = 0;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Connection con = null;
        String sql = "INSERT INTO table ( column1, column2, column3, column4, column5, column6) values (?, ?, ?, ?, ?, localtimestamp)";
        try 
            con = getConnection();
            ps = con.prepareStatement(sql);
            rs = ps.getResultSet();
            ps.setString(1, retorno.getNome_arquivo());
            ps.setString(2, retorno.getNumero_autenticacao().trim());
            ps.setString(3, retorno.getNosso_numero());
            ps.setDate(4, retorno.getData_pagamento());
            ps.setDouble(5, retorno.getValor());
            update = ps.executeUpdate();  

         catch (SQLException e) 
            throw new TopLevelException(e);
         catch (Exception e) 
            throw new TopLevelException(e);
         finally 
            try 
                close(rs, ps, con);
             catch (SQLException e) 
                throw new TopLevelException(e);
            
        
        return update;
       

当我执行 ps.executeUpdate() 方法时,返回给我一个插入新 id 的成功消息,但是,当我在我的桌子上查找这个 id 时,那里没有插入任何东西。我已经检查了我的数据库参数、连接等,但它仍然无法正常工作...有人可以帮帮我吗?

【问题讨论】:

这可能不是你的问题的原因,但你为什么有一个ResultSet,你为什么打电话给getResultSet() @Samuel 嗨,谢谢,resultSet 是错误的,我删除了它,坏的仍然不起作用:( 为什么不查找数据源而不是您的自定义 bean 并从中获取连接? 你的类/方法上有事务注解吗? 如果您在连接上调用commit() 会发生什么?也许您获得的连接已禁用自动提交。顺便提一句。为什么要使用 XADataSource?而不是“常规”数据源? XA DataSource 用于分发事务(在不同的应用程序服务器之间)。使用org.postgresql.ds.PGConnectionPoolDataSource 会改变什么吗? 【参考方案1】:

为了隔离问题,尝试:

    在数据库中执行手动插入以检查自动提交设置?如果工作 - Java 中的问题。如果不起作用 - 数据库中的问题

    创建一个简单的类来执行插入并检查它是否有效。可以,应用设置有问题。如果不起作用 - FU## 与 Java/Driver 一起使用!

    如果 1 和 2 有效,请尝试使用事务:

    Transaction t =  beginTransaction(); // session???
    //your code here
    tx.commit;
    

【讨论】:

欢迎来到 SO!请发送tour 以获得您的第一个闪亮徽章。 大家好,我的问题解决了,我是JTA = "true" 发现当我们使用JTA时,如果发生任何异常他没有输入我的数据,然后挂断JTA解决了我的问题数据库和它的工作:))))))))

以上是关于我的 executeUpdate() 工作,但没有提交的主要内容,如果未能解决你的问题,请参考以下文章

sql 异常 不能为带有 SELECT 查询的 SELECT 发出 executeUpdate

executeUpdate() 抛出 MySQLSyntaxErrorException

PrepareStatement 挂在 executeUpdate 函数上

通过 stmt.executeUpdate 更新 access 数据库中的整数

PreparedStatement.executeUpdate() 不影响数据库

准备好的语句的 Java ExecuteUpdate 方法挂起