标签: batch-insert

Codeigniter在SQL中插入多行

我对Codeigniter很新鲜.我的表格看起来像这样.

<tr>
<td><input type="text" name="Name[0]" value=""></td>
<td><input type="text" name="Address[0]"  value=""><br></td>
<td><input type="text" name="Age[0]" value=""></td>
<td><input type="text" name="Email[0]" value=""></td>
</tr>



<tr>
<td><input type="text" name="Name[1]" value=""></td>
<td><input type="text" name="Address[1]"  value=""><br></td>
<td><input type="text" name="Age[1]" value=""></td>
<td><input type="text" name="Email[1]" value=""></td>
</tr>
Run Code Online (Sandbox Code Playgroud)

可能有0到n行,通常是5到10行.如何在SQL中插入它们?这可能与Codeigniter或我应该使用本机PHP脚本?


$name=$_POST['Name'];
$address=$_POST['Address'];
$age=$_POST['Age'];
$email=$_POST['Email'];
$count = count($_POST['Name']);



for($i=0; $i<$count; $i++) {
$data = array(
           'name' => $name[$i], 
           'address' => $address[$i],
           'age' => $age[$i],
           'email' => $email[$i],

           );


  $this->db->insert('mytable', $data);
}
Run Code Online (Sandbox Code Playgroud)

我这样做了 有用.但解决方案似乎不够优雅.

kevtrout的答案看起来更好,但目前正在抛出很多错误.

有没有办法一次性插入所有数据?

mysql sql optimization codeigniter batch-insert

8
推荐指数
2
解决办法
3万
查看次数

使用nativequery的JPA(Hibernate)和postgres sql批处理upsert

我想JPA和Postgres 进行批量upsert .我不能使用merge,因为我正在检查不是PK的Unique Constraint上的冲突.我发现要在postgres中进行upsert,我们现在可以使用ON Conflict功能.所以基本上我想在中执行本机查询JPA.查询将如下:

INSERT INTO user (user_id, display_name )
VALUES('1', 'sg27')  
    ON CONFLICT (user_id) DO UPDATE 
SET display_name = 'sg27' RETURNING *;
Run Code Online (Sandbox Code Playgroud)

我将循环遍历对象列表并进行查询.

所以我的问题是在本机查询插入的情况下,我们可以使用手动刷新em.flush().它是否适用于批量插入.

如果没有,那么有人可以告诉我这个问题的可能解决方案是什么?

谢谢你的时间.

postgresql hibernate jpa upsert batch-insert

8
推荐指数
1
解决办法
1241
查看次数

JDBC Batch执行速度极慢

任何人都可以告诉我我做错了什么我在mysql中执行350个插件并且它需要40秒.

这是代码

long t0 = System.currentTimeMillis();
        Connection con = connectionProvider.getConnection();
        PreparedStatement s = con.prepareStatement("insert into domkee.friends(idFriends,friend1Id,friend2Id,friend2Name) values(?,?,?,?)");
        con.setAutoCommit(false);
        for (Friend f : friends) {
            s.setLong(1, 0);
            s.setLong(2, f.getFriend1Id());
            s.setLong(3, f.getFriend2Id());
            s.setString(4, f.getFriend2Name());
            s.addBatch();

        }
        long t1 = System.currentTimeMillis() - t0;
        s.executeBatch();
        long t2 = System.currentTimeMillis()-t0;
        con.commit();
        long t3 = System.currentTimeMillis()-t0;
        s.close();
        con.close();
        long t4 = System.currentTimeMillis()-t0;
        System.out.println(((double)t1/1000) + ";" + ((double)t2/1000) + ";" + ((double)t3/1000) + ";" + ((double)t4/1000));
Run Code Online (Sandbox Code Playgroud)

这是控制台:

0.156;39.251;39.376;39.486
Run Code Online (Sandbox Code Playgroud)

所以这.executeBatch()是40秒,这可能是什么问题?

java mysql jdbc batch-insert

7
推荐指数
1
解决办法
3374
查看次数

具有返回子句的JDBC批量插入

在使用JDBC Batch Insert语句时,有没有办法在JAVA中使用return子句获取受影响行的值?我能够获得受影响的单行所需的值.但不是所有批量插入?

代码:

try {
    String query = "INSERT INTO temp ( "
                 + "org_node_id, org_node_category_id,  org_node_name, "
                 + "customer_id, created_by, created_date_time, "
                 + "updated_date_time, activation_Status )"
                 + " VALUES (seq_org_node_id.nextval,  11527,  'Abcd',  9756,  1,  sysdate,   sysdate,   'AC')"
    +" returning org_node_id, org_node_name INTO ?, ?";

    con = DBUtils.getOASConnection();

    OraclePreparedStatement ps = (OraclePreparedStatement) con.prepareStatement(query);
    ps.registerReturnParameter(1, Types.INTEGER);
    ps.registerReturnParameter(2, Types.VARCHAR);
    ps.execute();

    ResultSet rs = ps.getReturnResultSet();
    rs.next();

    System.out.println("Org ID : "+ rs.getInt(1));
    System.out.println("Org Name : "+ rs.getString(2));

} catch (SQLException e) {
  e.printStackTrace(); …
Run Code Online (Sandbox Code Playgroud)

oracle jdbc batch-insert

7
推荐指数
1
解决办法
1183
查看次数

插入大量记录而不锁定表

我试图在表格中插入1,500,000条记录.我在插入过程中面临表锁定问题.所以我想出了下面的批量插入.

DECLARE @BatchSize INT = 50000

WHILE 1 = 1
  BEGIN
      INSERT INTO [dbo].[Destination] 
                  (proj_details_sid,
                   period_sid,
                   sales,
                   units)
      SELECT TOP(@BatchSize) s.proj_details_sid,
                             s.period_sid,
                             s.sales,
                             s.units
      FROM   [dbo].[SOURCE] s
      WHERE  NOT EXISTS (SELECT 1
                         FROM   dbo.Destination d
                         WHERE  d.proj_details_sid = s.proj_details_sid
                                AND d.period_sid = s.period_sid)

      IF @@ROWCOUNT < @BatchSize
        BREAK
  END 
Run Code Online (Sandbox Code Playgroud)

我在Destination表上有一个聚簇索引(proj_details_sid ,period_sid ).NOT EXISTSpart只是为了限制插入的记录再次插入表中

我做得对吗,这会避免表锁吗?还是有更好的方法.

注意:批次和没有批量插入时间或多或少相同

sql t-sql sql-server batch-insert sql-insert

6
推荐指数
2
解决办法
2万
查看次数

如何在休眠中提交批量插入?

我必须使用hibernate将大量对象保存到数据库中.我想在会话中出现n(BATCH_SIZE)对象时提交,而不是一次提交所有这些对象.

Session session = getSession();
session.setCacheMode(CacheMode.IGNORE);
for(int i=0;i<objects.length;i++){
    session.save(objects[i]);
    if( (i+1) % BATCH_SIZE == 0){
        session.flush();
        session.clear();
    }
}
Run Code Online (Sandbox Code Playgroud)

我会尝试类似上面的东西,但我读到session.flush()它没有提交数据库的更改.这是以下代码正确的方法吗?

Session session = getSession();
session.setFlushMode(FlushMode.COMMIT);
session.setCacheMode(CacheMode.IGNORE);
session.beginTransaction();
for(int i=0;i<objects.length;i++){
    session.save(objects[i]);
    if( (i+1) % BATCH_SIZE == 0){
        session.getTransaction().commit();
        session.clear();
        //should I begin a new transaction for next batch of objects?
        session.beginTransaction();
    }
}
session.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)

java hibernate commit flush batch-insert

5
推荐指数
1
解决办法
1902
查看次数

Spring JPA - Hibernate:批量插入执行过多 select nextval ('sequence')

现在我正在尝试增强 Web 应用程序的性能,我使用 spring JPA 2.3.0- Hibernate 5.4.15.Final、Postgres 12 并通过 @Transaction 管理事务。Web应用程序部署在aws beanstalk上,同时运行多个实例,但数据库实例不可扩展。我使用 bigSerial 类型作为表的 ID。

例如,我有一个 STUDENTS 表,ID 是 bigSerial 和一些其他列。我在使用时遇到问题

@GeneratedValue(strategy = GenerationType.IDENTITY)

,Hibernate在保存实体列表时无法批量插入。我尝试使用

@GeneratedValue(strategy = GenerationType.AUTO, generator = "students_id_seq") 
@SequenceGenerator(name = "students_id_seq", sequenceName = "students_id_seq")

hibernate.id.new_generator_mappings=false
hibernate.jdbc.batch_size=10 
hibernate.order_inserts=true 
hibernate.order_updates=true
hibernate.batch_versioned_data=true
Run Code Online (Sandbox Code Playgroud)

看起来Hibernate可以批量插入,但问题是Hibernate执行了select nextval ('students_id_seq')多次。如果实体列表有30个项目,Hibernate会执行select nextval30次,批量插入查询则执行3次。

一些统计数据:

  • 如果使用 GenerationType.IDENTITY

    • 保存(实体):
      • insert into ... : 执行一次
    • 保存全部(n 个实体)
      • insert into ... : 执行n次
  • 如果使用 GenerationType.SEQUENCE/ GenerationType.AUTO

    • 保存(实体):
      • select nextval ('students_id_seq'): 执行一次
      • insert into ... : …

java spring hibernate batch-insert spring-data-jpa

5
推荐指数
1
解决办法
4527
查看次数

如何在codeigniter活动记录中使用select插入记录

我想使用CodeIgniter Active Record类实现一个SQL查询.查询看起来像这样..

INSERT california_authors (au_id, au_lname, au_fname)
SELECT au_id, au_lname, au_fname
FROM authors
WHERE State = 'CA'
Run Code Online (Sandbox Code Playgroud)

在不使用$ this-> db->查询方法的情况下,CodeIgniter中是否可以这样做?

方案:

$this->db->select('au_id, au_lname, au_fname');
$this->db->from('california_authors');
$this->db->where('state', 'CA');
$query = $this->db->get();

if($query->num_rows()) {
    $new_author = $query->result_array();

    foreach ($new_author as $row => $author) {
        $this->db->insert("authors", $author);
    }           
}
Run Code Online (Sandbox Code Playgroud)

问候

activerecord codeigniter batch-insert

4
推荐指数
1
解决办法
2万
查看次数

使用REST优化Neo4j中的大批量批量插入

我需要通过REST API的Batch端点将大量节点与它们之间的关系插入Neo4j,大约5k记录/秒(仍在增加).

这将是24x7的连续插入.每条记录可能只需要创建一个节点,但其他记录可能需要创建两个节点和一个关系.

我可以通过更改程序或修改Neo4j的设置来提高插入的性能吗?

我到目前为止的进展:

1.我一直在测试Neo4j,但是我无法获得所需的性能

测试服务器盒:24核+ 32GB RAM

Neo4j 2.0.0-M06作为独立服务安装.

在同一台服务器上运行我的Java应用程序.(Neo4j和Java应用程序将来需要在自己的服务器上运行,因此无法使用嵌入式模式)

REST API端点:/ db/data/batch(target:/ cypher)

使用模式索引,约束,MERGE,CREATE UNIQUE.

2.我的架构:

neo4j-sh (0)$ schema
==> Indexes
==>   ON :REPLY(created_at)   ONLINE                             
==>   ON :REPLY(ids)          ONLINE (for uniqueness constraint) 
==>   ON :REPOST(created_at) ONLINE                             
==>   ON :REPOST(ids)        ONLINE (for uniqueness constraint) 
==>   ON :Post(userId)      ONLINE                             
==>   ON :Post(postId)    ONLINE (for uniqueness constraint) 
==> 
==> Constraints
==>   ON (post:Post) ASSERT post.postId IS UNIQUE
==>   ON (repost:REPOST) ASSERT repost.ids IS UNIQUE
==>   ON (reply:REPLY) ASSERT reply.ids IS …
Run Code Online (Sandbox Code Playgroud)

java rest neo4j cypher batch-insert

4
推荐指数
1
解决办法
5016
查看次数

Hibernate - 如何验证是否真正执行批量插入

技术堆栈:Oracle数据库11.2.0.2,Java 1.6,Hibernate 3.6.6.Final.

我是新来的冬眠,如果这是微不足道的话道歉.

以下代码应该进行一些优化:

Transaction tx = session.beginTransaction();
for (int i = 0; i < 10; i++) {
   POJO pojo = new POJO(i);
   session.save(pojo);
}
tx.commit();
Run Code Online (Sandbox Code Playgroud)

hibernate.cfg.xml 有以下条目

<property name="jdbc.batch_size">500</property>
Run Code Online (Sandbox Code Playgroud)

如果hibernate真的批量所有这些插入,我如何验证?如果它执行10次插入而不是没有增益.一个想法是在save()检查记录是否已添加到db 之后立即放置jdbc普通查询:

String query = "retrieve previously added element"
PreparedStatement stmt = session.connection().prepareStatement(query.toString());
Result rs = statement.executeQuery();
/** check contents of rs */
Run Code Online (Sandbox Code Playgroud)

在我的例子中,它返回一个非空集与先前添加的元素.这有什么意义吗?我怎样才能检查批处理是否有效.

提前致谢

java oracle orm hibernate batch-insert

4
推荐指数
2
解决办法
4102
查看次数