net+Oracle开发过程中遇到的小问题
最新的项目开始使用Oracle后,5个月之间遇到一些在SqlServer中没有遇到的问题,这里记录并贴上一些常用的解决办法。
Oracle相关
一、数据库不同版本还原
刚开始我们一直使用Oracle12C进行开发,到上线服务器时说12C与可能不太稳定,有些问题不好定位就转用11g,这里牵扯到12C导出的DMP文件导入到11G上的问题,导出导入语句:
exp 账号/密码@STO_DataBase file=D:\STO_DataBase.dmp full=y
imp 账号/密码@STO_DataBase file=D:\DataBackUp\STO_DataBase.dmp full=y
导入报异常版本不一样,无法导入,这里用一款小工具可以解决问题下载地址。
二、数据库创建
数据库文件大小受DB_BLOCK_SIZE决定,默认是8K对应的数据库文件是32G,所以创建数据库时数据库的大小不要设置最大值最好设置成无限大,可以多设置几个数据库文件,以免数据库大小不够用引起数据库异常。创建语句:
//创建表空间
CREATE TABLESPACE STO_Data
LOGGING
DATAFILE
'D:\DataBase\DbFile\STO_DATA.DBF',
'D:\DataBase\DbFile\STO_DATA1.DBF',
'D:\DataBase\DbFile\STO_DATA2.DBF'
SIZE 512M
AUTOEXTEND ON
NEXT 512M MAXSIZE unlimited
EXTENT MANAGEMENT LOCAL;
//创建临时表空间
CREATE TEMPORARY TABLESPACE STO_Temp
TEMPFILE 'D:\DataBase\DbFile\STO_Temp.DBF'
SIZE 512M
AUTOEXTEND ON
NEXT 512M MAXSIZE unlimite
EXTENT MANAGEMENT LOCAL;
//创建用户
CREATE USER 用户名 IDENTIFIED BY 用户名密码
DEFAULT TABLESPACE STO_Data
TEMPORARY TABLESPACE STO_Temp
//用户赋权限
grant connect,resource,dba to 用户名
三、常见问题
(1)存储过程参数
存储过程的参数命名最好可以按照规则来否则会有问题,例如:
create or replace procedure Proc_Test(IN_CompanyName in varchar2,
OUT_Table out sys_refcursor) as
begin open OUT_Table for select * from Waybill_Pickup t where t.companyname=IN_CompanyName;
end Proc_Test;
如果参数使用的和数据库中的表字段一样会引起失效,例如:
create or replace procedure Proc_Test(CompanyName in varchar2,
OUT_Table out sys_refcursor) as
begin open OUT_Table for select * from Waybill_Pickup t where t.companyname=CompanyName;
end Proc_Test;
(2)定期释放Temp文件空间
长时间使用会使Temp文件越来越大,而引起某些操作异常。
alter tablespace STO_TEMP shrink space;
(3)索引失效
Oracle批量插入如果是用Oracle.DataAccess.Client.OracleBulkCopy 类,数据在插入过程中会引起索引失效,如果是业务表就会引起业务查询非常缓慢。但是插入效率很高,如果数据库使用读写分离,或者接口采用读写分离的两个表可以通过此方法进行插入,如果遇到索引失效可用以下语句查看和修复。
//查看失效索引
select * from user_indexes where Status='UNUSABLE'
//重建失效索引
begin
FOR cur in (select INDEX_NAME from user_indexes where Status='UNUSABLE') loop
execute immediate 'alter index '|| cur.INDEX_NAME||' rebuild' ;
END LOOP;
end;
(4)遇到问题如何排查
当Oracle遇到内部问题出现异常和挂机后的排查步骤(Oracle服务器)
- 查找日志D:\app\Administrator\diag\rdbms\sto_database\stodatabase\alert
- 查询跟踪文件D:\app\Administrator\diag\rdbms\sto_database\stodatabase\trace
- 然后定位问题解决问题
当时遇到的问题是:数据库直接Down掉了,连接时报没有监听程序。重启服务器后过一会数据库就挂掉了
检查Oracle日志:
D:\app\Administrator\diag\rdbms\sto_database\stodatabase\alert
查看Log文件,在日志文件中找到错误信息提示:
检查跟踪文件
D:\app\Administrator\diag\rdbms\sto_database\stodatabase\trace
在跟踪文件中查看错误信息引起的原因:
根据错误查找出引起错误的SQL语句,最后定位到是单条语句超过65535个参数引起,由于.net中使用了DbDataAdapter进行保存数据,他类似于拼接的Sql语句,更改批次提交数解决问题。
.net相关
一、处理传参和LONG RAW类型
DbCommand处理Oracle数据库默认参数绑定是按次序且不能查询LONG RAW类型,处理SqlServer数据库不用处理,
所以在初始化DbCommand时需要加入如下代码
(cmd as Oracle.DataAccess.Client.OracleCommand).BindByName=true;
(cmd as Oracle.DataAccess.Client.OracleCommand).InitialLONGFetchSize = -1;
二、批量插入
(1)OracleBulkCopy
OracleBulkCopy在Oracle.DataAccess.DLL中,速率很快,但不进行主键和唯一键检查,经常会将唯一索引弄坏,并且在插入过程中普通索引也会失效。
/// <summary>
/// 批量插入数据库
/// </summary>
/// <param name="datatable"></param>
/// <returns></returns>
public string OracleBulkInsert(DataTable datatable)
{
OracleBulkCopy bulkCopy = new OracleBulkCopy(_connStr, OracleBulkCopyOptions.UseInternalTransaction);
try
{
bulkCopy.DestinationTableName = datatable.TableName;
bulkCopy.BulkCopyTimeout = 600000;
bulkCopy.BatchSize = 50000;
if (datatable != null && datatable.Rows.Count != 0)
bulkCopy.WriteToServer(datatable);
return "";
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (bulkCopy != null)
bulkCopy.Close();
}
}
DataTable在插入时应注意字段类型和顺序,可以用以下代码获得表结构
/// <summary>
/// 根据表名获取Table结构
/// </summary>
/// <param name="tableName">表名</param>
/// <returns></returns>
public DataTable InitStructureByTable(string tableName)
{
DataTable dtColums = helper.GetDataSet("select column_name,data_type from user_tab_columns where table_name='" + tableName.ToUpper() + "' order by column_id", null).Tables[0];
DataTable dtNew = new DataTable();
dtNew.TableName = tableName;
//匹配列数
for (int j = 0; j < dtColums.Rows.Count; j++)
{
switch (dtColums.Rows[j][1].ToString().ToUpper())
{
case "DATE":
dtNew.Columns.Add(new DataColumn(dtColums.Rows[j][0].ToString(), typeof(DateTime)));
break;
case "NUMBER":
dtNew.Columns.Add(new DataColumn(dtColums.Rows[j][0].ToString(), typeof(double)));
break;
default:
dtNew.Columns.Add(new DataColumn(dtColums.Rows[j][0].ToString(), typeof(string)));
break;
}
}
return dtNew;
}
(2)DbDataAdapter批量插入
这种插入方式要比OracleBulkCopy要慢,相当于拼接了带参数的插入语句插入,注意UpdateBatchSize数值不要过大,否则可能由于单句Sql语句参数超过65535引起数据库崩溃。
/// <summary>
/// 批量插入数据库
/// </summary>
/// <param name="datatable"></param>
/// <returns></returns>
public string BulkInsertCopy(DataTable datatable)
{
DbDataAdapter adapter = _factory.CreateDataAdapter();
DbCommand cmd = _factory.CreateCommand();
DbCommandBuilder cb = _factory.CreateCommandBuilder();
try
{
adapter.UpdateBatchSize = 200;
using (DbConnection conn = _factory.CreateConnection())
{
conn.ConnectionString = ConnectionString;
conn.Open();
cmd.Connection = conn;
//cmd.Transaction = conn.BeginTransaction();
cb.DataAdapter = adapter;
adapter.SelectCommand = cmd;
adapter.SelectCommand.CommandText = "select * from " + datatable.TableName;
adapter.FillSchema(datatable, SchemaType.Source);
adapter.Update(datatable);
//cmd.Transaction.Commit();
}
return "";
}
catch (Exception ex)
{
//cmd.Transaction.Rollback();
return ex.Message;
}
finally
{
cmd.Dispose();
cb.Dispose();
adapter.Dispose();
}
}
net+Oracle开发过程中遇到的小问题的更多相关文章
- asp.net mvc开发过程中的一些小细节
现在做网站用mvc越来越普及了,其好处就不说了,在这里只记录一些很多人都容易忽视的地方. 引用本地css和js文件的写法 这应该是最不受重视的地方,有同事也说我有点小题大作,但我觉得用mvc还是得有一 ...
- JAVA开发过程中的各种小坑
1.有时候你在本地跑的ECLIPSE中得到的正确的结果,部署到服务器上使用其他容器,如tomcat或WARS的时候,跑出的结果也许就不一致, 我们程序员会经常抱怨,在我机器上跑的好好的. 在不同的容器 ...
- 小程序开发过程中常见问题[微信小程序、支付宝小程序]
目录 一.样式中如何使用background-image呢? 二.使用自适应单位rpx类似于rem,布局尽量使用flex布局 三.万能的{{双大括号,用于在模版中输出变量 四.你想要的基础组件和API ...
- Windows 8.1 开发过程中遇到的小问题(2)
又是在Windows 8.1 的分享功能,再次出现错误: A COM call (IID: ***, method index: *) to an ASTA (thread *) was blocke ...
- Windows 8.1 开发过程中遇到的小问题
最近在开发Windows 8 应用的时候碰到了一个莫名的问题,错误内容如下:(其中 **.DLL是本地创建的项目,在主项目中添加了引用,其中大部分代码是MVVM light 框架库的代码) Syste ...
- android开发过程中遇到的小问题
转自:http://www.sctarena.com/Article/Article.asp?nid=50701.在编写xml布局的时候,总是提示[Accessibility] Missing ...
- oracle过程中动态语句实现
oracle过程中动态语句实现 一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DD ...
- 小程序红包开发跳坑记 微信小程序红包接口开发过程中遇到的问题 微信小程序红包开发
现在做小程序的越来越多,商家推广也是一个瓶颈,谁不发点红包,都很难找到人来用你的微信小程序了.于是不管你开发什么小程序功能,你或多或少都要用到小程序来发红包吧. 我们自己之前做公众号发红包,做了两三 ...
- 在WePY中实现了小程序的组件化开发,组件的所有业务与功能在组件本身实现,组件与组件之间彼此隔离,上述例子在WePY的组件化开发过程中,A组件只会影响到A所绑定的myclick
wepyjs - 小程序组件化开发框架 https://tencent.github.io/wepy/document.html#/?id=%e5%be%ae%e4%bf%a1%e5%b0%8f%e7 ...
随机推荐
- arcgis api for js入门开发系列十六迁徙流动图
最近公司有个arcgis api for js的项目,需要用到百度echarts迁徙图效果,而百度那个效果实现是结合百度地图的,怎么才能跟arcgis api结合呢,网上搜索,终于在github找到了 ...
- http头部 Expect
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/90 在通过curl调用对方接口时,发现超时现象很严重,于是询问对 ...
- [置顶]
xamarin android自定义spinner
以前弄的一个下拉框时自带的spinner,感觉好丑,实际效果实在满足不了基本的UI界面要求,还是自己动手丰衣足食,看了网上关于android中自定义spinner的文章,感觉实现原理还是比较简单,所以 ...
- ArcGIS API for JavaScript 4.2学习笔记[26] 缓冲区分析【基于geometryEngine工具类】
要说GIS空间分析最经典的例子,就是缓冲区分析了. 本例使用geometryEngine来绘制缓冲区环.因为官方给的例子有3D和2D场景,所以就会显得比较复杂. 当鼠标在视图上点击时,就会生成一个缓冲 ...
- 2、转载一篇,浅析人脸检测之Haar分类器方法
转载地址http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html 浅析人脸检测之Haar分类器方法 [补充] 这是我时隔差不多两年后, ...
- shell 踩坑记
变量赋值时,等号两边不能有空格: 在判断表达式中,不论是 [ -n "$1" ] 还是 [ -f "$1" ] 都要在变量两侧加上双引号: 在使用与或非判断式 ...
- python 小脚本升级-- 钉钉群聊天机器人
一则小脚本(工作中用) 在这篇文章中写的监控的脚本,发送监控的时候 是利用的邮箱,其实在实际,邮箱查收有着不方便性,于是乎升级, 我们工作中,经常用钉钉,那么如果要是能用到钉钉多好,这样我们的监控成功 ...
- 【http转https】其之一:腾讯云 DV SSL证书申请实验
文:铁乐猫 2016年1月 前言 大概2017年12月28日左右公司提出以后需要将公司网站由http提升到https级别,以便谷歌和火狐浏览器将之认定为安全网站. 主要是出于客户.用户那边用火狐或谷歌 ...
- 如何复制Google浏览器的控制台内容
今天在调用第三方的接口,对着文档,传参数,老是报参数错误,没办法只能把参数打印出来看看,在Google控制台上看,费劲,就想复制出来,格式化一下,然后对着文档进行对比. console.info(JS ...
- 纯css去实现loading动画效果图
当项目中加载内容慢的的时候,需要显示一个loading动画效果图 之前我们使用的是一圈点点旋转的效果,现在设计修改为,如下gif图片效果-------------------------------- ...