Java 是否有JDBC驱动程序支持加载数据内嵌sql命令?

Java 是否有JDBC驱动程序支持加载数据内嵌sql命令?,java,mysql,database,jdbc,Java,Mysql,Database,Jdbc,您好,我想通过JDBC在多个数据库(如DB2、Sybase、MySQL等)上创建表。现在我需要使用文本文件(如data.txt)创建此表,其中包含数据空间分隔值。例如 CustName OrderNo PhoneNo XYZ 230 123456789 ABC 450 879641238 现在,这个data.txt包含数千条记录,这些记录以空格分隔。我需要使用JavaIO逐行解析这个文件,并对每个记录执行SQLINSERT查询 我发现有加载数据的内

您好,我想通过JDBC在多个数据库(如DB2、Sybase、MySQL等)上创建表。现在我需要使用文本文件(如data.txt)创建此表,其中包含数据空间分隔值。例如

CustName OrderNo PhoneNo

XYZ      230     123456789
ABC      450     879641238    
现在,这个data.txt包含数千条记录,这些记录以空格分隔。我需要使用JavaIO逐行解析这个文件,并对每个记录执行SQLINSERT查询

我发现有加载数据的内嵌sql命令。是否有JDBC驱动程序支持此命令?如果不是,什么应该是解决这个问题的最有效的快速方法


请导游。提前感谢。

我相信
加载数据填充
比使用Java解析文件和插入记录更快。您可以通过JDBC执行
加载数据填充的查询。根据这一点和:

LOAD DATA INFILE语句以非常高的速度将文本文件中的行读取到表中。


该文件应位于服务器中。您可以尝试这两种方法,记录每种方法消耗的时间。

我认为
LOAD DATA infle
是mySql特有的,我怀疑JDBC驱动程序是否支持它。其他数据库将具有类似(但不同)的实用程序

如果你想这样做是一个独立于数据库的方式,我想你有两个选择

  • 解析输入文件并通过JDBC连接使用SQL INSERT语句
  • 编写许多不同的、依赖于数据库的脚本,确定您正在使用的dbms,并使用Runtime.exec执行正确的dbms

  • 除非您有令人信服的性能理由不这样做,否则我会选择选项1。

    以下内容将通过JDBC工作。请注意,要使用
    加载数据填充
    ,您需要超级用户权限。
    加载数据本地填充不需要它

    Connection con = DriverManager.getConnection("jdbc:mysql://localhost/foobar", "root", "password");
    Statement stmt = con.createStatement();
    String sql = 
        "load data infile 'c:/temp/some_data.txt' \n" +
        "   replace \n" +
        "   into table prd \n" +
        "   columns terminated by '\\t' \n" +
        "   ignore 1 lines";
    stmt.execute(sql);
    
    如果使用
    加载数据填充
    文件位置基于服务器的文件系统!如果您使用的是本地文件,那么显然它是基于客户端的文件系统。

    加载数据本地infle”与MySQL的JDBC驱动程序配合使用,这方面存在一些问题


    使用“加载数据填充”或“加载数据本地填充”时,插入的记录将不会添加到bin日志中,这意味着如果使用复制,“加载数据填充”插入的记录将不会传输到从属服务器,插入的记录将不会有任何事务记录,这就是为什么加载数据填充比标准的插入要快得多,而且因为插入的数据没有经过验证。

    你可以通过JDBC使用
    load data infle
    (文件必须位于服务器上!)-你为什么不试试呢?@a_horse_with_no_name非常感谢你的输入。我读到JDBC驱动程序不支持LOAD DATA INFILE命令,所以我问了这个问题?你在哪里读到的?当你尝试时发生了什么?嘿@Umesh-我希望你没有从我下面的答案中得到这个答案。我只是猜测JDBC驱动程序不会支持它。@DaveHowes我没有从你的答案中得到答案,我在很多地方也读到了同样的答案,所以我在这里问了一个问题,JDBC驱动程序支持加载数据填充。我非常感谢你的输入。我怀疑JDBC驱动程序不支持LOAD DATA INFILE sql命令。这就是我问这个问题的原因。请引导。好的-谢谢你的澄清。但我猜这是mySql特有的吗?OP需要跨多个数据库工作的东西,因此,除非所有供应商的数据加载实用程序都通过JDBC驱动程序工作,否则他仍然会遇到麻烦。是的,它是特定于MySQL的。有些DBMS通过SQL语句(例如,Postgres的
    COPY
    )支持这一点,有些DBMS没有用于批量加载的SQL语句,只有外部命令行程序。非常感谢您的回答。我知道这段代码可以在MYSQL上运行,但我希望它能在Sybase、Oracle、DB2上运行,我怀疑它能否在这些dbs上运行。由于您是数据库专家,请指导。
    加载数据
    是MySQL特有的功能。它在任何其他DBMS上都不可用。如果你想用一种跨平台的方式来实现这一点,你必须自己解析文件,并为每一行生成“普通”的INSERT语句。我也这么认为,无论如何,我都必须解析文件,谢谢你的指导。这不是真的;通过加载数据填充加载的数据被复制。我有使用复制功能在生产中运行7年的证据:)数据肯定没有得到很好的验证(例如无效日期->臭名昭著的
    0000-00-00
    ),但插入本身发生在连接启动的任何事务的上下文中。