数据库连接释放问题引起的“与服务器的连接被重置”

本文描述了一个业务系统中文件下载接口出现的异常情况——文件下载过程中断,详细记录了问题排查过程,最终发现是由数据库连接未正确释放导致。

        最近在业务系统中写了个下载文件的接口,供公司的其他工具下载业务系统中的文件。结果在下载文件时发现,文件下载了一部分就无法再下载。系统提示“与服务器的连接被重置” 。有时候甚至不会提示 ,IE的保存进度框会突然消失不见。


        

        一开始以为是C#.NET或者IIS的问题。因为在本机VS2010里调试时没有任何问题,文件能顺利下载。

       因为在服务器上打开IE下载也不行,所以可以排除网络和防火墙问题。

       求助度娘和谷哥了大半天,没有找到任何能解决我问题的方法。

       自己在业务系统中写的调试日志也没起什么作用,出问题的代码位置似乎有些随机性。


       后来看了服务器的系统日志,发现了以下错误:

发生未处理的异常,并已终止进程。

Application ID: /LM/W3SVC/6/ROOT

Process ID: 316

Exception: System.InvalidOperationException

Message: 内部 .Net Framework 数据提供程序错误 1。

StackTrace:    在 System.Data.ProviderBase.DbConnectionInternal.PrePush(Object expectedOwner)
   在 System.Data.ProviderBase.DbConnectionPool.PutObject(DbConnectionInternal obj, Object owningObject)
   在 System.Data.ProviderBase.DbConnectionInternal.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory)
   在 System.Data.SqlClient.SqlInternalConnection.CloseConnection(DbConnection owningObject, DbConnectionFactory connectionFactory)
   在 System.Data.SqlClient.SqlConnection.Close()
   在 System.Data.SqlClient.SqlConnection.Dispose(Boolean disposing)
   在 System.ComponentModel.Component.Dispose()
   在 BLL.DataConnection.Finalize()

        然后又通过屏蔽不同位置的代码,终于定位到了错误:

ProcedureBLL b = new ProcedureBLL(new DataConnection());
//其他代码……
        正确写法应该为:
using (DataConnection c = new DataConnection())
{
    ProcedureBLL b = new ProcedureBLL(c);
    //其他代码…… 
}   

        这次的问题是由于数据库连接未及时被释放引起的。


### Oracle 11g 数据库测试连接失败的原因及解决方案 Oracle 11g 数据库测试连接失败可能由多种原因引起,以下是一些常见原因及其对应的解决方案: #### 1. 监听器未启动或配置错误 监听器是客户端数据库服务器之间通信的关键组件。如果监听器未正确启动或配置错误,可能导致连接失败。 - **原因**:监听器未启动,或者 `listener.ora` 文件中的配置不正确[^1]。 - **解决方法**: - 检查监听器状态,使用命令 `lsnrctl status` 验证监听器是否运行。 - 如果监听器未启动,使用 `lsnrctl start` 启动监听器。 - 确保 `listener.ora` 文件中配置了正确的主机名、端口和 SID。 ```bash lsnrctl status lsnrctl start ``` #### 2. 数据库服务未启动 即使监听器正常运行,但如果数据库实例未启动,客户端也无法连接数据库。 - **原因**:数据库服务未启动或未注册到监听器[^2]。 - **解决方法**: - 使用命令 `sqlplus / as sysdba` 登录数据库,并执行以下命令检查数据库状态: ```sql SELECT status FROM v$instance; ``` - 如果数据库未启动,执行以下命令启动数据库: ```sql STARTUP ``` #### 3. 网络配置问题 网络配置错误可能导致客户端无法访问数据库服务器。 - **原因**:防火墙阻止了数据库端口(默认为 1521),或者客户端的 `tnsnames.ora` 文件配置错误[^4]。 - **解决方法**: - 确保服务器上的防火墙允许 1521 端口的流量。 - 检查客户端的 `tnsnames.ora` 文件,确保其包含正确的连接字符串。例如: ``` ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_host_name)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) ``` #### 4. 用户名或密码错误 输入的用户名或密码错误也会导致连接失败。 - **原因**:用户提供的凭据不正确[^5]。 - **解决方法**: - 确保输入的用户名和密码正确。 - 如果忘记密码,可以使用以下命令重置密码: ```sql ALTER USER username IDENTIFIED BY new_password; ``` #### 5. 数据库实例不可用 某些情况下,数据库实例可能因资源不足或其他原因无法提供服务。 - **原因**:数据库实例处于受限模式或已关闭[^2]。 - **解决方法**: - 检查数据库日志文件(如 `alert.log`)以获取更多错误信息。 - 根据日志提示解决问题,例如释放内存资源或修复磁盘空间不足的问题。 #### 6. Java 应用程序连接问题 如果是通过 Java 应用程序连接 Oracle 数据库,可能会遇到驱动程序或连接字符串配置问题。 - **原因**:JDBC 驱动程序版本不兼容或连接字符串错误[^5]。 - **解决方法**: - 确保使用数据库版本兼容的 JDBC 驱动程序。 - 检查 Java 代码中的连接字符串是否正确。例如: ```java String url = "jdbc:oracle:thin:@your_host_name:1521:orcl"; String user = "username"; String password = "password"; Connection connection = DriverManager.getConnection(url, user, password); ``` ### 示例代码 以下是一个简单的 Java 连接 Oracle 数据库的示例: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class OracleConnectionTest { public static void main(String[] args) { String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String user = "scott"; String password = "tiger"; try (Connection connection = DriverManager.getConnection(url, user, password)) { System.out.println("Connection successful!"); } catch (SQLException e) { System.out.println("Connection failed: " + e.getMessage()); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值