Java中的Connection赋值为null与conn.close

本文讨论了在使用数据库连接(conn)时应注意的三个关键点:在关闭前检查conn是否为null以确保连接已初始化;直接将conn置null仅能释放内存但无法关闭连接,可能导致资源泄漏;关闭后将conn置null有助于避免误用已关闭的连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.conn在close之前判断conn!=null更多的是出错保护的需要,防止初始化连接的时候已经出错导制conn未被赋值的情况。

2.conn不close直接置null只能释放内存,不会释放连接,会造成连接资源泄漏。

3.conn在close之后再设置 null是一个好习惯,可以避免已经关闭的连接再次被误用,还有就是一个连接被关闭两次的情况。

 

最后欢迎大家访问我的个人网站:1024s

org.apache.jasper.JasperException: 在 [8] 行处理 [front/index.jsp] 时发生异常 5: <jsp:useBean id="conn" scope="page" class="com.tools.ConnDB" /> 6: <% 7: /* 最新上架商品信息 */ 8: ResultSet rs_new = conn.executeQuery("select t1.ID, t1.GoodsName,t1.price,t1.picture,t2.TypeName " 9: + "from tb_goods t1,tb_subType t2 where t1.typeID=t2.ID and " 10: + "t1.newGoods=1 order by t1.INTime desc limit 12");//查询最新上架商品信息 11: int new_ID = 0;//保存最新上架商品ID的变量 Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:584) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:475) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:356) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:307) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 根本原因。 java.lang.NullPointerException: Cannot invoke "java.sql.Connection.createStatement(int, int)" because "this.conn" is null com.tools.ConnDB.executeQuery(ConnDB.java:68) org.apache.jsp.front.index_jsp._jspService(index_jsp.java:140) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:64) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:446) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:356) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:307) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ):注意 主要问题的全部 stack 信息可以在 server logs 里查看
最新发布
08-12
报错:Dao4.Dao40(+ 1重载) "Dao4":using语句中使用的类型必须可隐式转换为”System.IDisposable" using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _2 { class Dao4 { private readonly string _conn; // 公共属性暴露连接对象 public SqlConnection Connection { get; private set; } // 构造函数1:从配置文件获取连接字符串 public Dao4() { if (string.IsNullOrEmpty(_conn)) { // 默认连接字符串(仅用于开发环境) _conn = "Server=LAPTOP-265KA3NF;Database=pointnote;Integrated Security=True;"; } } // 构造函数2:允许传入自定义连接字符串 public Dao4(string connectionString) { if (string.IsNullOrWhiteSpace(connectionString)) throw new ArgumentException("连接字符串不能为空", nameof(connectionString)); _conn = connectionString; } public void Connect() { // 实际项目中应从配置读取连接字符串 Connection = new SqlConnection(_conn); Connection.Open(); } public int ExecuteParameterized(string sql, List<SqlParameter> parameters) { using (SqlCommand cmd = new SqlCommand(sql, Connection)) { // 添加所有参数 cmd.Parameters.AddRange(parameters.ToArray()); // 执行并返回受影响行数 return cmd.ExecuteNonQuery(); } } // 增加一个方法用于执行查询并返回SqlDataReader public SqlDataReader Read(string sql) { SqlCommand cmd = new SqlCommand(sql, Connection); return cmd.ExecuteReader(); } // 关闭连接的方法(可选) public void Disconnect() { if (Connection != null && Connection.State != ConnectionState.Closed) { Connection.Close(); } } // 添加 Close 方法 public void Close() { if (Connection != null && Connection.State != ConnectionState.Closed) { Connection.Close(); Connection = null; } } // 实现 IDisposable 模式 public void Dispose() { Close(); GC.SuppressFinalize(this); } internal int Execute(string sql) { int rowsAffected = 0; try { using (SqlCommand cmd = new SqlCommand(sql, Connection)) { rowsAffected = cmd.ExecuteNonQuery(); } } catch (SqlException ex) { // 记录日志或进行其他异常处理操作 Console.WriteLine($"执行SQL语句时发生错误:{ex.Message}"); } return rowsAffected; } } } 怎么改
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值