程序是个定时的程序,5分钟一次反复调用。
数据库在远程,连接字符串类似于“Data Source=AAA;user=AAA;password=AAA”
代码应该没啥问题
try
{
using(OracleConnection conn = new OracleConnection(connStr))
{
conn.open();
//里面就是简单的查询、更新语句,不写了
}
}
catch(Exception e)
{
}
运行一段时间后,程序就会在conn.open()那里或卡死,不返回,也不会抱错,不会进入catch。程序就一直等着,最长等过一天一夜,最后重启IIS好的。
1、首先查过数据库没有锁。
2、可能和连接池有关系,因为重启IIS,或者清空池,重新运行就可以了。
3、Oracle的连接不支持timeout属性,所以连接字符串里没设置。
4、连接池不想禁用,因为调用频繁,禁用后性能下降非常明显。
5、由于数据库在远程,网络不是太稳定,是有导致连接无效的可能,但不是不拋出异常的理由。
6、google搜了半天,有类似的问题,都是E文,而且没看到到底怎么解决的(除了说到禁用连接池).
数据库在远程,连接字符串类似于“Data Source=AAA;user=AAA;password=AAA”
代码应该没啥问题
try
{
using(OracleConnection conn = new OracleConnection(connStr))
{
conn.open();
//里面就是简单的查询、更新语句,不写了
}
}
catch(Exception e)
{
}
运行一段时间后,程序就会在conn.open()那里或卡死,不返回,也不会抱错,不会进入catch。程序就一直等着,最长等过一天一夜,最后重启IIS好的。
1、首先查过数据库没有锁。
2、可能和连接池有关系,因为重启IIS,或者清空池,重新运行就可以了。
3、Oracle的连接不支持timeout属性,所以连接字符串里没设置。
4、连接池不想禁用,因为调用频繁,禁用后性能下降非常明显。
5、由于数据库在远程,网络不是太稳定,是有导致连接无效的可能,但不是不拋出异常的理由。
6、google搜了半天,有类似的问题,都是E文,而且没看到到底怎么解决的(除了说到禁用连接池).
这个有什么其他办法吗?
连接用完后没有归还,而且没有设置超时异常 导致程序一直等待获取连接尝试使用finally强制关闭连接
{
com.Dispose();
conn.Dispose();
conn.Close();//关闭打开的连接
}
try
{
conn.open()
//执行数据操作
}
catch(Exception)
{
}
finally
{
try
{
conn.close();
}
catch(Exception)
{
if(conn!=null && conn.State=ConnectionState.Open)
conn.close();
}
}
解决方案,事务commit后在做其它操作。
我用的是
using(OracleConnection conn = new OracleConnection(connStr))
{
conn.open();
}
连接是会关闭的
有事务的地方我都是用
using(OracleConnection conn = new OracleConnection(connStr))
{
conn.open();
using(OracleTransaction trans = conn.BeginTransaction())
{
//do something
trans.commit();
}
}
事务应该是会正常关闭,除非谁告诉我using的用法不对。
而且事实上大部分时间运行是正常的,只在很特殊的情况下会出问题。现在不知道什么情况,怀疑是与oracle服务器之间连接有什么问题的时候,因为我调的是远程oracle,而且基本上后连接池有点关系。
一个已经正常运行了2个礼拜,没有死过一次。另一个没有规律的死,有的时候1天,有的时候2、3天。
部署环境也不用怀疑了,我曾经放在同一个机器上,由于有一个死了以后,影响iis才分开的。
using(OracleConnection conn = new OracleConnection(connStr))
{
conn.open();
//do something
conn.Close();
//虽然conn会自动会被GC回收,最好还是按流程先conn.Close();
}
以前有一次忘了關,也是老出錯就是找不到原因,重啟IIS就可以用一陣子.
{
}
会自动生成dispose语句,dispose又会调用close语句的阿。
oci.ll的OCIStmtExecute,就是这个方法会卡死。我装的oci.dll的版本是10.2.0.1。
现在关键是为什么会卡死,Oracle为什么设计成这个方法是卡死呢?我看到最新的版本是11.2.0.1,新的oci.dll是否修复了这个问题呢?11.2.0.1的客户端能和10.2.0.1服务器端一起用吗?
我现在用的微软提供的数据访问层.System.Data.OracleClient;是不是Oracle提供的ODP.Net考虑了这个问题呢?