史上最全的java分布式锁的5种实现方式

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 要实现Excel一万条数据批量导入,可以使用Apache POI库来读取和解析Excel文件,并使用JDBC连接数据库将数据批量插入。

要实现Excel一万条数据批量导入,可以使用Apache POI库来读取和解析Excel文件,并使用JDBC连接数据库将数据批量插入。以下是一个简单的示例代码:

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class ExcelImporter {

    public static void main(String[] args) throws Exception {
        // 设置数据库连接参数
        String url = "jdbc:mysql://localhost:3306/test";
        String username = "root";
        String password = "123456";
        String driverClassName = "com.mysql.jdbc.Driver";

        // 加载数据库驱动
        Class.forName(driverClassName);

        // 建立数据库连接
        Connection conn = DriverManager.getConnection(url, username, password);

        // 创建预编译SQL语句,用于批量插入数据
        String sql = "INSERT INTO mytable (col1, col2, col3) VALUES (?, ?, ?)";
        PreparedStatement ps = conn.prepareStatement(sql);

        // 读取Excel文件
        File file = new File("data.xlsx");
        FileInputStream fis = new FileInputStream(file);
        Workbook workbook = WorkbookFactory.create(fis);
        Sheet sheet = workbook.getSheetAt(0);

        // 遍历Excel文件中的每一行数据
        Iterator<Row> rowIterator = sheet.rowIterator();
        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();

            // 读取每个单元格的数据,并设置预编译SQL语句的参数
            Cell cell1 = row.getCell(0);
            Cell cell2 = row.getCell(1);
            Cell cell3 = row.getCell(2);
            ps.setString(1, cell1.getStringCellValue());
            ps.setString(2, cell2.getStringCellValue());
            ps.setString(3, cell3.getStringCellValue());

            // 将预编译SQL语句添加到批处理中
            ps.addBatch();
        }

        // 执行批处理,将数据批量插入到数据库中
        ps.executeBatch();

        // 关闭资源
        ps.close();
        conn.close();
        fis.close();
    }

}

在上述代码中,我们首先设置了数据库连接参数,然后加载数据库驱动并建立数据库连接。接着,我们创建了一个预编译SQL语句,用于批量插入数据。然后,我们使用Apache POI库读取Excel文件,并遍历每一行数据,将每个单元格的数据设置为预编译SQL语句的参数,并将预编译SQL语句添加到批处理中。最后,我们执行批处理,将数据批量插入到数据库中,并关闭资源。

需要注意的是,上述代码中的Excel文件必须符合以下要求:

文件格式必须为.xlsx格式;
文件中的第一行必须是表头,用于描述每个字段的名称;
文件中的每一行数据必须按照表头的顺序,依次填写每个字段的值。
如果Excel文件不符合上述要求,则需要修改代码来适配不同的文件格式。

Python使用批量插入:在原有的代码基础上,使用批量插入的方式来导入数据,可以大大提高插入的效率。代码示例如下:

import pymysql

def batch_insert(data):
    try:
        conn = pymysql.connect(host='localhost', user='root', password='123456', db='test', charset='utf8')
        cursor = conn.cursor()
        sql = "INSERT INTO users(id, name, age) VALUES (%s, %s, %s)"
        cursor.executemany(sql, data)
        conn.commit()
        cursor.close()
        conn.close()
    except Exception as e:
        print(e)

data = [
    (1, '张三', 20),
    (2, '李四', 21),
    (3, '王五', 22),
    # ...
]

batch_insert(data)

使用多线程或协程:在原有的代码基础上,使用多线程或协程的方式来并行处理数据,可以提高处理数据的效率。代码示例如下:

import pymysql
import threading

def insert_data(data):
    try:
        conn = pymysql.connect(host='localhost', user='root', password='123456', db='test', charset='utf8')
        cursor = conn.cursor()
        sql = "INSERT INTO users(id, name, age) VALUES (%s, %s, %s)"
        cursor.executemany(sql, data)
        conn.commit()
        cursor.close()
        conn.close()
    except Exception as e:
        print(e)

def batch_insert(data, batch_size=1000, num_threads=4):
    num_data = len(data)
    num_batches = (num_data + batch_size - 1) // batch_size
    batches = [data[i * batch_size:(i + 1) * batch_size] for i in range(num_batches)]

    threads = []
    for i in range(num_threads):
        t = threading.Thread(target=insert_data, args=(batches[i],))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

data = [
    (1, '张三', 20),
    (2, '李四', 21),
    (3, '王五', 22),
    # ...
]

batch_insert(data, batch_size=1000, num_threads=4)

使用数据库事务:在原有的代码基础上,使用数据库事务的方式来插入数据,可以保证数据的完整性和一致性。代码示例如下:

import pymysql

def batch_insert(data):
    try:
        conn = pymysql.connect(host='localhost', user='root', password='123456', db='test', charset='utf8')
        cursor = conn.cursor()
        conn.begin()
        sql = "INSERT INTO users(id, name, age) VALUES (%s, %s, %s)"
        cursor.executemany(sql, data)
        conn.commit()
        cursor.close()
        conn.close()
    except Exception as e:
        print(e)

data = [
    (1, '张三', 20),
    (2, '李四', 21),
    (3, '王五', 22),
    # ...
]

batch_insert(data)
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5天前
|
监控 数据可视化 Java
【JAVA】分布式链路追踪技术概论
【JAVA】分布式链路追踪技术概论
18 2
|
29天前
|
消息中间件 Java Linux
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
|
1天前
|
缓存 监控 负载均衡
Java一分钟之-Ehcache:分布式缓存系统
【6月更文挑战第17天】**Ehcache是Java的开源缓存库,支持本地和分布式缓存,提供负载均衡、数据复制和容错能力。常见问题包括网络分区导致的数据不一致、缓存雪崩和配置不当引起的性能瓶颈。解决策略涉及选择强一致性策略、设置合理缓存过期时间和监控调整配置。使用Ehcache需添加相关依赖,并配置分布式缓存,如示例所示,通过CacheManager创建和管理缓存。实践中,持续监控和优化配置至关重要。**
16 1
|
7天前
|
消息中间件 监控 Java
Java一分钟之-Kafka:分布式消息队列
【6月更文挑战第11天】Apache Kafka是一款高性能的消息队列,适用于大数据处理和实时流处理,以发布/订阅模型和分布式设计处理大规模数据流。本文介绍了Kafka基础,包括生产者、消费者、主题和代理,以及常见问题:分区选择、偏移量管理和监控不足。通过Java代码示例展示了如何创建生产者和消费者。理解并妥善处理这些问题,结合有效的监控和配置优化,是充分发挥Kafka潜力的关键。
14 0
|
19天前
|
Java 持续交付 API
Java的分布式系统与微服务架构
Java的分布式系统与微服务架构
|
21天前
|
存储 缓存 负载均衡
基于Java的分布式缓存系统设计与实现
基于Java的分布式缓存系统设计与实现
31 1
|
27天前
|
消息中间件 存储 Java
Java分布式技术面试总结(全面,实时更新)
Java分布式技术面试总结(全面,实时更新)
|
28天前
|
存储 缓存 监控
Java一分钟之-Apache Ignite:分布式内存计算平台
【5月更文挑战第21天】Apache Ignite是一款开源的分布式内存计算平台,涉及内存数据网格、流处理和计算服务。本文关注其常见问题,如数据丢失、分区不均、内存管理和网络延迟。为保证数据一致性,建议使用适当的數據模式和备份策略,实现数据持久化。优化内存配置和监控网络可提升性能与稳定性。提供的Java代码示例展示了如何创建分区缓存并设置备份。正确配置和管理Ignite是构建高可用、高性能应用的关键,持续监控集群状态至关重要。
45 0
|
28天前
|
缓存 监控 Java
Java一分钟之-Apache Geode:分布式内存数据平台
【5月更文挑战第21天】Apache Geode是低延迟的分布式内存数据平台,用于构建实时应用,提供缓存、数据库和消息传递功能。本文聚焦于Geode的常见问题,如数据一致性(数据同步延迟和分区冲突)和性能瓶颈(网络延迟和资源管理不当),并提出解决方案。确保数据一致性可通过选择合适的数据策略和利用`InterestPolicy`、`CacheListener`;提升性能则需优化网络和合理配置资源。通过示例代码展示了如何创建和操作Geode的Region。正确配置和调优Geode对于实现高可用、高性能应用至关重要。
46 1
|
1月前
|
监控 数据可视化 Java
【JAVA】分布式链路追踪技术概论
skywalking拥有更加的强大和细粒度的图形监控界面。
34 2