【问题标题】:Batch didn't run, JDBC批处理未运行,JDBC
【发布时间】:2018-06-18 08:50:02
【问题描述】:

我在运行批处理时遇到了一点问题..

首先,我还在学习JDBC等,如果我的错误真的很愚蠢,请见谅..

我必须在我的数据库中插入一些 SQL 查询。因此,我正在像这样构建我的 PreparedStatements:

String add = "INSERT INTO company_type VALUES (?,?)";
PreparedStatement company = write.getConnection().prepareStatement(add);

ResultSet com = types.getCompanyType();

while(com.next()) {
    System.out.print("1");
    company.setInt(1, com.getInt(1));
    company.setString(2, com.getString(2));
    company.addBatch();

    if(i > size) {
        company.executeBatch();
        i = 0;
    }
    i++;
} 

company.executeBatch();

通过调试器后,我知道company.executeBatch(); 行出了点问题。

它只是没有执行,我的程序似乎陷入了循环或静止不动。

有没有人,怎么能看出错误?

谢谢

附:我没有得到任何异常。

public Connection getConnection(){

    Connection connection = null;

    try{
        Class.forName( "oracle.jdbc.driver.OracleDriver" );
    } catch(ClassNotFoundException e) {
        this.loginmessage.setText("Fehler beim Laden des Oracle JDBC Treibers!");
        e.printStackTrace();
        return connection;
    }

    try {
        connection = DriverManager.getConnection("j******************);
    } catch (SQLException e) {
        this.loginmessage.setText("Verbindung fehlgeschlagen!");
        e.printStackTrace();
        return connection;
    }

    if (connection != null) {
        loginmessage.setText("Verbindung hergestellt!");
        return connection;
    } else {
        loginmessage.setText("Verbindung fehlgeschlagen!");
        System.out.print("huaha");
    }
    return connection;
}

【问题讨论】:

  • 你有什么异常吗?如果是的话是哪一个? (Edit 您的问题 - 在 cmets 中不邮政编码或其他信息)
  • 嘿,首先,感谢您的回答.. 不,我没有得到任何异常:S
  • 可能缺少commit()?
  • 了解数据库并知道write 类型和write.getConnection 是什么可能会很好(如果它是您自己的实现与否)
  • 我正在从 PostgreSQL 数据库中读取数据并尝试写入 Oracle 数据库,我会将方法向上发布

标签: java database jdbc prepared-statement


【解决方案1】:

你必须像这样提交事务,

write.getConnection().commit();

以下是批处理中涉及的步骤,

  1. 先关闭autocommit,让所有Batch语句执行 在单个事务中,并且没有提交批处理中的操作 分别。毕竟这是我们需要的。
  2. 使用addBatch 向批处理中添加所需数量的语句。
  3. 然后通过调用 executeBatch()
  4. 最后commit 或roll-back 交易。

下面给出了一个示例代码。

public void saveLogEntries(List<LogEntry> entries) {
    try (Connection connObj = DriverManager.getConnection(JDBC_DB_URL, JDBC_USER, JDBC_PASS);
        PreparedStatement prepareStatement = connObj
            .prepareStatement("INSERT INTO logentry (date, ip, request) values(?, ?,?)")) {
                connObj.setAutoCommit(false);
                for(LogEntry entry : entries) {
                    try {
                        prepareStatement.setString(1, entry.getDate());
                        prepareStatement.setString(2, entry.getIp());
                        prepareStatement.setString(3, entry.getRequest());
                        prepareStatement.addBatch();
                    } catch (SQLException e) {
                        // Handle SQL exception here.
                    }
                };

                prepareStatement.executeBatch();
                connObj.commit();
    } catch (SQLException e) {
        // Handle SQL exception here.
    }
}

但是 Class.forName() 不再需要。查看此post 了解更多详情。您可以更改获取连接的方式,然后重试。代码对我来说似乎有点笨拙。

【讨论】:

  • 我已经读过这方面的内容,但在我添加一些新的查询之前,一切都按照我发布的方式进行。我会用 commit() 试试。谢谢 :)
  • 我在 executeBatch() 行后面添加了它,但仍然出现问题.. 似乎它没有解决问题:/ 哦,你编辑了你的答案,我会回来的分钟:D
  • 尝试按照我的答案和示例代码中提到的步骤进行操作。
  • 为什么你有两个executeBatch 语句?目的是什么?
  • 假设 OP 确实将自动提交设置为 false。 或者它是否设计为仅在一个事务中使用批处理?仅供参考:关于两个执行批处理,如果你有 100k 行要插入,你不想发送一个批处理,你发送多个小批处理
【解决方案2】:

一种可能性是您尚未提交,因此服务器端事务超时并回滚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多