设为首页 收藏本站
查看: 859|回复: 0

[经验分享] C#操作Oracle的CLOB列

[复制链接]

尚未签到

发表于 2016-7-22 11:42:23 | 显示全部楼层 |阅读模式
  Oracle clob列的大小超过32M时使用分割发送,小于32M时正常发送
  
  
  Oracle clob列性能测试的测试用例:
  

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
namespace db
{
class Program
{
// private OracleConnection mycon = new OracleConnection("Data Source=DB1;User Id = system;Password= asdf1234;");
private OracleConnection mycon = new OracleConnection("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.167.133.89)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=db1)));User Id = system;Password= asdf1234;");
private OracleCommand mycom = null;
private void open()
{
mycon.Open();
}
private void close()
{
mycon.Close();
}
private void delete()
{
mycom = new OracleCommand("delete from system.tb1", mycon);
mycom.ExecuteNonQuery();
}
private void insert(int num, Int32 length)
{            
String insertStr = "insert into system.tb1(CINT,CCLOB) values(:p1,:p2)";
mycom = new OracleCommand(insertStr, mycon);
string s = "a";
DateTime dt1, dt2;
OracleClob clob = null;
OracleDataReader dr;
if (length>=16)
{               
if (length == 128)
{
for (int i = 0; i < 27; i++)
{
s += s;
}
}
else if (length == 32)
{
for (int i = 0; i < 25; i++)
{
s += s;
}
}
else
{                    
s = "";
string tmp = "a";
for (int i = 0; i < 20; i++)
{
tmp += tmp;
}
for (int j = 0; j < length; j++)
{
s += tmp;
}
}
dt1 = DateTime.Now;
char[] charArray = null;
for (int i = 0; i < num; i++)
{
mycom.CommandText = "insert into system.tb1(CINT,CCLOB) values(" + i + ",'a')";
mycom.ExecuteNonQuery();
mycom.CommandText = "select CINT,CCLOB from system.tb1 where CINT=" + i;
dr = mycom.ExecuteReader();
dr.Read();
clob = dr.GetOracleClobForUpdate(1);
clob.Erase();
charArray = s.ToCharArray();
for (int j = charArray.Length; j >0; j -= 1024 * 1024)
{
clob.Write(charArray, 0, 1024 * 1024);
}
}
dt2 = DateTime.Now;
mycom = new OracleCommand("select * from system.tb1", mycon);
dr = mycom.ExecuteReader();
dr.Read();
Console.WriteLine(dr.GetOracleClob(1).Length / 1024 / 1024 / 2 + "M");
}
else
{
s = "";
string tmp = "a";
for (int i = 0; i < 20; i++)
{
tmp += tmp;
}
for (int j = 0; j < length; j++)
{
s += tmp;
}
dt1 = DateTime.Now;
for (int i = 0; i < num; i++)
{
mycom.Parameters.Clear();
/*
para1 = new OracleParameter("p1", OracleDbType.Int32);
para2 = new OracleParameter("p2", OracleDbType.Clob);
para1.Value = i;
para2.Value = s;
mycom.Parameters.Add(para1);
mycom.Parameters.Add(para2);
*/
mycom.Parameters.Add("p1", OracleDbType.Int32).Value=i;
mycom.Parameters.Add("p2", OracleDbType.Clob).Value=s;
mycom.ExecuteNonQuery();
}
dt2 = DateTime.Now;
mycom = new OracleCommand("select * from system.tb1", mycon);
dr = mycom.ExecuteReader();
dr.Read();
Console.WriteLine(dr.GetString(1).Length / 1024 / 1024 + "M");
}
TimeSpan ts = dt2 - dt1;
Console.Out.WriteLine("insert time: " + ts.TotalSeconds);
}
private void select(int num)
{
OracleDataReader dr = null;
string selStr = "";
mycom = new OracleCommand(selStr, mycon);
DateTime dt1 = DateTime.Now;
String s;
for (int i = 0; i < num; i++)
{
mycom.CommandText = "select * from system.tb1 where CINT=" + i;
dr = mycom.ExecuteReader();
while(dr.Read())
s=dr.GetString(1);
//Console.Out.WriteLine(s.ToString().Length);
dr.Close();
}
DateTime dt2 = DateTime.Now;
TimeSpan ts = dt2 - dt1;
Console.Out.WriteLine("select time: " + ts.TotalSeconds);
}
static void Main(string[] args)
{
try
{
Program p = new Program();
Console.Out.WriteLine("please input 3 parameters:");
Console.Out.WriteLine("1.sql type (insert/select)");
string sqlType;
sqlType = Console.In.ReadLine();
while (!sqlType.Equals("insert") && !sqlType.Equals("select"))
{
Console.Out.WriteLine("sql type is not insert or select,please input insert or select");
sqlType = Console.In.ReadLine();
}
Console.Out.WriteLine("2.loop time");
string loopNumStr = Console.In.ReadLine();
int loopNum = 0;
try
{
loopNum=Convert.ToInt32(loopNumStr);
}
catch (System.Exception e)
{
System.Console.WriteLine(e.Message.ToString());
}
Console.Out.WriteLine("3.data length(MB)");
string dataLengthStr = Console.In.ReadLine();
int dataLength = 0;
try
{
dataLength=Convert.ToInt32(dataLengthStr);
}
catch (System.Exception e)
{
System.Console.WriteLine(e.Message.ToString());
}
p.open();
if (sqlType.Equals("insert"))
{
p.delete();
p.insert(loopNum, dataLength);
}
else if (sqlType.Equals("select"))
{
p.select(loopNum);
}
p.close();
Console.In.Read();
}
catch (System.Exception e)
{
System.Console.WriteLine(e.Message.ToString());
}
}
}
}

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-247862-1-1.html 上篇帖子: oracle客户端连接失败问题解决 下篇帖子: Oracle中下载数据库图片
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表