java 批量插入clob_Oracle:高效批量插入数据

声明:这不是教程,只是个小结。不适用于生产环境,仅属于实验性质的设定。

环境:JDK8,Oracle 11g

机器:Lenovo Y50,8G内存,512G硬盘,i5处理器

结论:18个字段,插入100万条数据,耗时20~30s。


Java部分:

1,使用的jar包是ojdbc6.jar

2,关闭自动提交

3,使用Connection.prepareStatement()预编译SQL语句,对于一个批次的数据而言,只需要编译一次即可。

4,对于每一条数据,在将参数设置到PreparedStatement对象之后,使用PreparedStatement.addBatch()方法添加到批次中。

5,每添加1000条数据,执行1次PreparedStatement.executeBatch()方法。

6,全部执行完毕后,手动一次性提交。

代码示例:

public 

代码示例:

/** 为经过预编译的ps设置插入语句的参数 */
public boolean insertParameters(PreparedStatement ps) {
	if (!checkNotNullKey() || ps == null) {
		return false;
	}
	try {
		if (this.myBinaryDouble == null) {
			ps.setNull(1, 8);
		} else {
			ps.setDouble(1, this.myBinaryDouble);
		}
		// 略......
		if (this.myVarchar2 == null) {
			ps.setNull(18, 12);
		} else {
			ps.setString(18, this.myVarchar2);
		}
		ps.addBatch();
	} catch (SQLException e) {
		e.printStackTrace();
		return false;
	}
	return true;
}

Oracle部分:

1,使用AWR和ADDM报告分析SQL执行情况。

@?/RDBMS/ADMIN/awrrpt.sql

@?/RDBMS/ADMIN/addmrpt.sql

注:当找不到生成的报告时,可以在设置报告名称时显示指定路径,如'E:/awrrpt_20200503.html'

2,为SGA和PGA设置合适的参数。

show parameter sga;

alter system set sga_max_size=512M scope=spfile;

alter system set sga_target=512M scope=spfile;

show parameter sga;

alter system set pga_aggregate_target=1G;

alter system set workarea_size_policy=auto;

3,重做日志文件。

--3-1,查询当前重做日志信息,包括大小、有多少组、和状态

select group#,bytes/1024/1024,status from v$log;

--3-2,查询日志目录

select * from v$logfile;

--3-3,添加2组日志,每组2048M,增加到5组日志

alter database add logfile group 4 'E:SOFTWAREORACLEORADATAORCLRED004.LOG' size 2048M;

alter database add logfile group 5 'E:SOFTWAREORACLEORADATAORCLRED005.LOG' size 2048M;

--3-4,切换日志

alter system switch logfile;

--3-5,删除日志

alter database drop logfile group 1;

alter database drop logfile group 2;

alter database drop logfile group 3;

注:遇到无法删除时,手工发一个检查点让DBWR工作

alter system checkpoint;

4,设置LOG BUFFER参数(64M)

ALTER SYSTEM SET LOG_BUFFER=67108864 SCOPE=SPFILE;

5,关闭FEEDBACK

查看:

select x.ksppinm name, y.ksppstvl value, x.ksppdesc describe

from sys.x$ksppi x, sys.x$ksppcv y

where x.inst_id = userenv('instance')

and y.inst_id = userenv('instance')

and x.indx = y.indx

and x.ksppinm like '%optimizer_use_feedback%';

关闭:

alter system set "_optimizer_use_feedback" = false;


数据库刚启动时所能达到的速度:

10000条数据:

3e122aedfe082ada18ae91f76e8a2ab7.png

100000条数据:

c0f2b49b67aa51d33d84a1cb5d16ca11.png

1000000条数据:

fade75f4b210b124e0f60c3803bbd778.png

c0acc76beeed0b1628dd30227471a777.png

21784bf4229d53e86e14d56043781554.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 SqlSugar 进行批量插入实体时,如果要插入 OracleClob 类型的数据,可以按照以下步骤进行操作: 1. 在实体类中定义一个属性,类型为 string,用于存储 Clob 数据。 ```csharp public class MyEntity { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public string ClobData { get; set; } // 用于存储 Clob 数据 } ``` 2. 在执行批量插入操作时,将 Clob 数据转换为 OracleClob 类型,并设置到实体的 ClobData 属性中。可以使用 SqlSugar 提供的 ToOracleClob 方法进行转换。 ```csharp var entities = new List<MyEntity> { new MyEntity { Id = 1, Name = "Entity 1", Description = "Description 1", ClobData = "Clob Data 1" }, new MyEntity { Id = 2, Name = "Entity 2", Description = "Description 2", ClobData = "Clob Data 2" }, // ... }; using (var db = new SqlSugarClient(connectionString)) { var insertable = db.Insertable(entities); foreach (var entity in entities) { // 将 ClobData 转换为 OracleClob 类型,并设置到实体的 ClobData 属性中 insertable = insertable.SetInsertIdentity().InsertColumns(it => it.Name, it => it.Description, it => it.ClobData.ToOracleClob()); } var result = await insertable.ExecuteCommandAsync(); } ``` 注意:在使用 ToOracleClob 方法时,需要在 SqlSugar 的连接字符串中指定 Oracle 数据库的 ProviderName,例如: ```csharp var db = new SqlSugarClient(new ConnectionConfig { ConnectionString = connStr, DbType = DbType.Oracle, IsAutoCloseConnection = true, InitKeyType = InitKeyType.Attribute, ProviderName = "Oracle.ManagedDataAccess.Client" }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值