我对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的答案看起来更好,但目前正在抛出很多错误.
有没有办法一次性插入所有数据?
我想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().它是否适用于批量插入.
如果没有,那么有人可以告诉我这个问题的可能解决方案是什么?
谢谢你的时间.
任何人都可以告诉我我做错了什么我在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秒,这可能是什么问题?
在使用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) 我试图在表格中插入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只是为了限制插入的记录再次插入表中
我做得对吗,这会避免表锁吗?还是有更好的方法.
注意:批次和没有批量插入时间或多或少相同
我必须使用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) 现在我正在尝试增强 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 ... : 执行一次insert into ... : 执行n次如果使用 GenerationType.SEQUENCE/ GenerationType.AUTO
select nextval ('students_id_seq'): 执行一次insert into ... : …我想使用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)
问候
我需要通过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) 技术堆栈: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)
在我的例子中,它返回一个非空集与先前添加的元素.这有什么意义吗?我怎样才能检查批处理是否有效.
提前致谢
batch-insert ×10
java ×5
hibernate ×4
codeigniter ×2
jdbc ×2
mysql ×2
oracle ×2
sql ×2
activerecord ×1
commit ×1
cypher ×1
flush ×1
jpa ×1
neo4j ×1
optimization ×1
orm ×1
postgresql ×1
rest ×1
spring ×1
sql-insert ×1
sql-server ×1
t-sql ×1
upsert ×1