批量原生写入数据

该段代码展示了如何使用Java进行数据插入操作,通过PreparedStatement执行批处理,提高性能。在数据为空、获取连接、关闭自动提交以及处理异常等方面进行了处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#写入方法

public void transfer(DataSource dataSource, String tableName, Data data) {
        if (data== null || data.size() <= 0) {
            throw new RuntimeException("数据为空!");
        }
        StringBuilder sb = new StringBuilder();
        sb.append("INSERT INTO");
        sb.append(" ");
        sb.append(tableName);
        sb.append("(");
        sb.append(struct.tagName());
        sb.append(",");
        sb.append(struct.tagValue());
        sb.append(",");
        sb.append(struct.charColumn());
        sb.append(")");
        sb.append(" ");
        sb.append("VALUES");
        sb.append("(?,?,?,?)");
        PreparedStatement preparedStatement = null;
        Connection conn = null;
        try {
            log.debug("start to get a connection");
            try {

                //设置缓存
                conn = getConnection(dataSource);
            } catch (SQLException e) {
                conn = getConnection(dataSource);
            }
            if (conn == null) {
                throw new RuntimeException("连接数据库失败!");
            }
            boolean autoCommit = conn.getAutoCommit();
            //关闭自动提交能大幅提升批量插入性能
            conn.setAutoCommit(false);
            preparedStatement = conn.prepareStatement(sb.toString());
            for (int i = 0; i < transferDataValue.size(); i++) {
                preparedStatement.setString(1, data.get(i).tagName());
                preparedStatement.setString(2, data.get(i).tagValue());
       
                preparedStatement.setString(3, data);
                preparedStatement.addBatch();
            }
            preparedStatement.executeBatch();
            conn.commit();
            //还原
            conn.setAutoCommit(autoCommit);
        } catch (Exception e) {
            log.warn(" conn database  error {}", e);
            throw new RuntimeException("conn database  error :" + e.getMessage());
        } finally {
            try {
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                log.warn("close preparedStatement error {}", e);
            }
        }
    }

### Python批量更新和写入数据库的方法 在Python中实现批量更新和写入数据库可以通过多种方式完成,具体取决于所使用的库以及目标数据库的类型。以下是几种常见的方法及其示例代码。 #### 使用`pymssql`进行批量写入 通过`pymssql`可以高效地向SQL Server数据批量插入数据。以下是一个完整的例子: ```python import pymssql def batch_insert_pymssql(): server = "(local)" user = "sa" password = "zhao" database = "setup" conn = pymssql.connect(server, user, password, database) cursor = conn.cursor() data_to_insert = [(i, f"zhao_{i}", f"pwd_{i}") for i in range(1, 21)] try: cursor.executemany("INSERT INTO firstday (id, username, password) VALUES (%d, %s, %s)", data_to_insert) conn.commit() print("数据插入成功!") except Exception as e: print(f"发生错误: {e}") conn.rollback() finally: cursor.close() conn.close() if __name__ == '__main__': batch_insert_pymssql() ``` 这种方法利用了`executemany()`函数来一次性插入多条记录[^1]。 --- #### 使用`pandas.DataFrame.to_sql`进行批量写入 如果需要将大量结构化数据(如CSV文件中的数据)导入到数据库中,推荐使用Pandas库配合SQLAlchemy引擎。这种方式不仅简单易用,而且性能较高。 ```python import pandas as pd from sqlalchemy import create_engine def bulk_write_with_pandas(): engine = create_engine('mssql+pymssql://sa:zhao@(local)/setup') df = pd.read_csv('employee_1.csv') df.to_sql(name='employees', con=engine, if_exists='append', index=False) bulk_write_with_pandas() ``` 上述代码片段展示了如何从CSV文件加载数据并通过`to_sql()`将其保存至SQL Server数据库[^4]。 --- #### 批量更新操作 对于批量更新场景,通常建议构建动态SQL语句或者采用ORM框架简化逻辑。下面提供了一个基于原生SQL的方式: ```python import pymssql def batch_update_data(): server = "(local)" user = "sa" password = "zhao" database = "setup" conn = pymssql.connect(server, user, password, database) cursor = conn.cursor() updates = [ ("Mary", 26), ("James", 41) ] update_query = "UPDATE employees SET age = %d WHERE name = %s" try: for record in updates: cursor.execute(update_query, (record[1], record[0])) conn.commit() print("数据更新成功!") except Exception as e: print(f"发生错误: {e}") conn.rollback() finally: cursor.close() conn.close() batch_update_data() ``` 此脚本逐一执行每一条更新命令,并确保所有更改都提交到了数据库[^1]。 --- #### 性能优化技巧 为了进一步提升效率,在实际应用过程中还可以考虑以下几个方面: - **减少网络往返次数**:尽可能一次发送更多指令给服务器端处理。 - **调整缓冲区大小**:某些驱动程序允许设置内部缓存容量以适应大数据集传输需求。 - **启用事务管理机制**:合理控制commit频率可有效降低锁竞争风险同时加快整体速度。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值