如何在Java线程中将记录插入数据库?

塞里库利艺术

我正在尝试处理Java中的多头处理。

我已经阅读了许多文章和问题(在StackOverflow上),但是找不到如何使用它的清晰示例。

我在HsqlDB数据库中有Unique_Numbers表。有2列:NUMBER和QTY。我的任务是检查数字是否存在,如果是,则增加数字的数量,如果不是,请插入此数字。

所以,我得到了什么。

这是我的数据库配置

private final ComboPooledDataSource dataSource;

public Database(String url, String userName, String password) throws PropertyVetoException {
    dataSource = new ComboPooledDataSource();
    dataSource.setDriverClass("org.hsqldb.jdbcDriver");
    dataSource.setJdbcUrl(url);
    dataSource.setUser(userName);
    dataSource.setPassword(password);
    dataSource.setMaxPoolSize(10);
    dataSource.setMaxStatements(180);
    dataSource.setMinPoolSize(5);
    dataSource.setAcquireIncrement(5);
}

这是我的逻辑:

public void insertRow(String number) throws SQLException {
    int cnt = getCount(number);
    if (cnt == 0) {
        insert(number);
    } else if (cnt > 0) {
        update(number);
    }
}

获取表中的数字

private int getCount(String number) {
        int cnt = 0;
        String sql = "select count(number) as cnt from \"PUBLIC\".UNIQUE_NUMBER where number='" + number + "'";
        try {
            Statement sta;
            try (Connection connection = dataSource.getConnection()) {
                sta = connection.createStatement();
                ResultSet rs = sta.executeQuery(sql);
                if (rs.next()) {
                    cnt = rs.getInt("cnt");
                }
            }
            sta.close();
        } catch (Exception e) {
            LOGGER.error("error select cnt by number" + e.toString());
        }

        return cnt;
    }

插入并更新

private boolean insert(String number) throws SQLException {
    String sql = "insert into \"PUBLIC\".UNIQUE_NUMBER (number, qty) values(?, ?)";
    try (Connection connection = dataSource.getConnection()) {
        connection.setAutoCommit(false);
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            ps.setString(1, number);
            ps.setInt(2, 0);
            ps.addBatch();
            ps.executeBatch();
            try {
                connection.commit();
            } catch (Exception e) {
                connection.rollback();
                LOGGER.error(e.toString());
                return false;
            }
        }
    }
    return true;
}

private boolean update(String number) throws SQLException {
    String sql = "update \"PUBLIC\".UNIQUE_NUMBER set (qty) = (?) where number = ?";
    int qty = selectQtyByNumber(number) + 1;
    try (Connection connection = dataSource.getConnection()) {
        connection.setAutoCommit(false);
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            ps.setInt(1, qty);
            ps.setString(2, number);
            ps.executeUpdate();
            try {
                connection.commit();
            } catch (Exception e) {
                connection.rollback();
                LOGGER.error(e.toString());
                return false;
            }
        }
    }
    return true;
}

如我所读,我必须使用池连接。每个线程建立一个连接很重要。启动应用程序时,出现约束异常或回滚异常:序列化失败。

我究竟做错了什么?

这是我的日志

[INFO] [generate38] ERROR se.homework.hwbs.tasks.un.server.threads.InsertRowThread - exception while inserting numberintegrity constraint violation: check constraint; SYS_CT_10114 table: UNIQUE_NUMBER

[INFO] [generate38] ERROR se.homework.hwbs.tasks.un.server.database.Database - error select cnt by number java.sql.SQLTransactionRollbackException: transaction rollback: serialization failure
[INFO] [generate38] ERROR se.homework.hwbs.tasks.un.server.threads.InsertRowThread - exception while inserting numbertransaction rollback: serialization failure

[INFO] [generate38] ERROR se.homework.hwbs.tasks.un.server.database.Database - error select cnt by number java.sql.SQLTransactionRollbackException: transactionrollback: serialization failure
step步

非交易方式

先做增量

update UNIQUE_NUMBER set qty = qty + 1 where number = ?

检查是否更新了任何行,如果没有更新则插入数字

int rowsMatched = ps.executeUpdate();
if(rowsMatched == 0) {
    try {
        insert into UNIQUE_NUMBER (number, qty) values(?, 0)
    } catch(Exception e) {
        // the insert will fail if another thread has already
        // inserted the same number. check if that's the case
        // and if so, increment instead.
        if(isCauseUniqueConstraint(e)) {
            update UNIQUE_NUMBER set qty = qty + 1 where number = ?
        } else {throw e;}
    }
}

无交易处理(setAutoCommit(false)commit()rollback())reqired。

交易方式

如果您仍想以事务方式执行此操作,则需要在单个事务中执行所有步骤,例如@EJP建议:

connection.setAutoCommit(false);
// check if number exists
// increment if it does
// insert if it doesn't
// commit, rollback & repeat in case of error
connection.setAutoCommit(true);

如果此代码与其他代码共享连接池,则将auto commit设置回true(因为这是其他人期望连接处于的默认状态),或者明确表示池中的连接将始终处于事务模式。

在您的代码中,getCount有时会在自动提交模式下获得一个连接(首次使用),有时会在事务性模式下获得一个连接(在insert和/或之后重用update)-这就是为什么您在中看到回滚异常的原因getCount

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Java线程中将记录插入数据库?

来自分类Dev

如何在多线程Java中插入数据库

来自分类Dev

如何在Java中将值插入数据库

来自分类Dev

如何在Java中将HashMap插入数据库

来自分类Dev

如何在另一个线程中将数据插入数据库

来自分类Dev

如何在Django中将列表项插入数据库?

来自分类Dev

如何在python中将变量插入sqlite数据库?

来自分类Dev

如何在循环中将数组插入数据库

来自分类Dev

如何在C#Windows应用程序中将记录从数据gridview条目插入SQL数据库?

来自分类Dev

如何在Java中将记录列表与数据库进行比较?

来自分类Dev

如何在NetBeans Java中将图像插入mysql数据库

来自分类Dev

如何在Java中将单选按钮的值插入数据库?

来自分类Dev

如何在Java中将通知菜单与数据库连接

来自分类Dev

如何在C#中将数据表插入到Access数据库

来自分类Dev

如何在Spring MVC中将JSON数据从JSON响应插入数据库

来自分类Dev

如何在Spring MVC中将数据从bean插入数据库?

来自分类Dev

如何在多个文件输入中将数据插入数据库?

来自分类Dev

如何在yii 1框架中将表单发布数据插入数据库

来自分类Dev

如何在Liferay 6.2中将数据插入数据库?

来自分类Dev

如何在Mule中将JSON数据动态插入数据库

来自分类Dev

如何在数据库表的while循环中插入多行学生记录分数?

来自分类Dev

如何在使用 django admin 将记录插入数据库后添加功能?

来自分类Dev

如何在SQL中将单列分为数据库记录的列?

来自分类Dev

如何在 Laravel 5.6 中将数据库记录下载为 Execl 文件

来自分类Dev

如何在 WordPress 中将数据库表中的每条记录注册为短代码

来自分类Dev

如何在PHP中将数组值作为键值对插入数据库表

来自分类Dev

如何在php中将变量数组分别插入数据库?

来自分类Dev

如何在Laravel中将复选框值插入数据库?

来自分类Dev

如何在数组中将SELECT中的多个Option插入MySQL数据库?

Related 相关文章

  1. 1

    如何在Java线程中将记录插入数据库?

  2. 2

    如何在多线程Java中插入数据库

  3. 3

    如何在Java中将值插入数据库

  4. 4

    如何在Java中将HashMap插入数据库

  5. 5

    如何在另一个线程中将数据插入数据库

  6. 6

    如何在Django中将列表项插入数据库?

  7. 7

    如何在python中将变量插入sqlite数据库?

  8. 8

    如何在循环中将数组插入数据库

  9. 9

    如何在C#Windows应用程序中将记录从数据gridview条目插入SQL数据库?

  10. 10

    如何在Java中将记录列表与数据库进行比较?

  11. 11

    如何在NetBeans Java中将图像插入mysql数据库

  12. 12

    如何在Java中将单选按钮的值插入数据库?

  13. 13

    如何在Java中将通知菜单与数据库连接

  14. 14

    如何在C#中将数据表插入到Access数据库

  15. 15

    如何在Spring MVC中将JSON数据从JSON响应插入数据库

  16. 16

    如何在Spring MVC中将数据从bean插入数据库?

  17. 17

    如何在多个文件输入中将数据插入数据库?

  18. 18

    如何在yii 1框架中将表单发布数据插入数据库

  19. 19

    如何在Liferay 6.2中将数据插入数据库?

  20. 20

    如何在Mule中将JSON数据动态插入数据库

  21. 21

    如何在数据库表的while循环中插入多行学生记录分数?

  22. 22

    如何在使用 django admin 将记录插入数据库后添加功能?

  23. 23

    如何在SQL中将单列分为数据库记录的列?

  24. 24

    如何在 Laravel 5.6 中将数据库记录下载为 Execl 文件

  25. 25

    如何在 WordPress 中将数据库表中的每条记录注册为短代码

  26. 26

    如何在PHP中将数组值作为键值对插入数据库表

  27. 27

    如何在php中将变量数组分别插入数据库?

  28. 28

    如何在Laravel中将复选框值插入数据库?

  29. 29

    如何在数组中将SELECT中的多个Option插入MySQL数据库?

热门标签

归档