如何正确关闭数据源连接?

2023-11-25

我有这个类,但我不确定如何正确关闭连接,因为即使我只有 3 个用户登录但有多个 sql 查询,我仍然遇到此错误。

> com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
> Data source rejected establishment of connection,  message from
> server: "Too many connections"
import java.io.File;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.sql.DataSource;

public class UserDaoImpl implements UserDao
{

    DataSource dataSource;

    public DataSource getDataSource()
    {
            return this.dataSource;
    }

    public void setDataSource(DataSource dataSource)
    {
            this.dataSource = dataSource;
    }


    public boolean isValidUser(String username, String password) throws SQLException
    {       
        PreparedStatement pstmt = null;
        ResultSet resultSet = null;
        boolean rt = false;
        try{
            PasswordEncryptor pws = new PasswordEncryptor();
            String encryptedPass = pws.encrypt(password);

            String query = "Select count(1) from userdetails where username = ? and password = ?";
            pstmt = dataSource.getConnection().prepareStatement(query);
            pstmt.setString(1, username);
            pstmt.setString(2, encryptedPass);
            resultSet = pstmt.executeQuery();
            if (resultSet.next()){
                    rt =  (resultSet.getInt(1) > 0);
            }
            else{
                rt = false;
            }
    }
    catch(Exception e){
        e.printStackTrace();

    }
    finally{
        resultSet.close();
        pstmt.close();
        dataSource.getConnection().close();
    }

        return rt;  
    }
}

Spring配置.xml

    <bean name="userDao" class="com.spring.acadconnect.services.UserDaoImpl">
   <property name="dataSource" ref="dataSource"></property>
   </bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="com.mysql.jdbc.Driver" />

    <property name="url" value="jdbc:mysql://localhost:3306/acadconnect" />

    <property name="username" value="root" />

    <property name="password" value="" />

</bean>

请注意您正在致电.getConnection()多次。尽管文档在这方面可能更清楚DataSource.getConnection()实际上opens一个新的连接(而不是返回现有的连接),因此您需要关闭从该方法返回的每个实例。

As .getConnection()每次调用此行时都会创建一个新实例,这是连接泄漏,因为它没有关闭返回的连接:

pstmt = dataSource.getConnection().prepareStatement(query);

此行浪费地打开一个新连接,但又立即关闭它:

dataSource.getConnection().close();

看起来您正在尝试为每次调用打开和关闭单独的连接isValidUser()(因为您要在该方法调用结束时关闭连接)。即使您修复了上述泄漏,这也不是连接的用途。相反,您应该在应用程序中共享一个连接(或其中一小部分)。因此,当您的程序启动时,您打开这样一个连接,并且一旦整个节目不再需要连接(通常在终止前不久),您可以将其关闭。

这种行为通常由依赖注入,您可以在其中构建连接和其他资源,然后将它们传递到需要它们的任何对象中 - 这将资源管理与使用这些资源的代码分离。举个简单的例子:

public static void main(String[] args) {
  DataSource dataSource = createDataSource();
  try (Connection connection = dataSource.getConnection()) {
    runProgram(connection);
  }
}


/**
 * this method doesn't need to worry about closing the Connection,
 * it trusts that its caller will be responsible for that.
 */
private static void runProgram(Connection connection) {
  // ...
}

根据经验,对象应该只负责关闭它们构造的对象,并且应该避免关闭它们传递的对象。在您当前的代码中UserDaoImpl正在打开连接,所以它应该负责关闭它,但我建议传递Connection反而。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确关闭数据源连接? 的相关文章

随机推荐

  • 如何使用 HTML 创建菜单树

    我需要使用 HTML 创建一个菜单树 我在谷歌上进行了搜索 但他们提供了一些软件供下载以创建此内容 但我需要一些脚本和 HTML 标签来执行此操作 谁能帮我解决这个问题 提前致谢 这是一个非常简单的开始 http www dynamicdr
  • 如何利用转义来防止XSS攻击?

    为了防止XSS攻击 输出 已启用转义 上面来自symfony 但我不明白 XSS 是 跨站脚本 的缩写 当您设法将脚本 通常是 javascript 偷偷溜到其他人的网站上并在那里恶意运行时 就会发生跨站点脚本攻击 当用户向网站输入内容时
  • 这个 Dictionary 异常怎么可能?

    给出以下堆栈跟踪 MESSAGE Value cannot be null Parameter name key SOURCE mscorlib TARGETSITE Void ThrowArgumentNullException Syst
  • 如何在 Flutter 中使用 Firebase 更改密码

    我想在 Flutter 中使用 Firebase 更改当前用户密码 任何人都可以帮助我如何实施更改密码方法吗 我知道这是一篇迟到的文章 但现在可以更改登录用户的密码 请务必通知用户重新登录 因为这是敏感操作 void changePassw
  • urlopen 返回有效链接的重定向错误

    我正在用 python 构建一个损坏的链接检查器 构建正确识别使用浏览器访问时无法解析的链接的逻辑变得很繁琐 我找到了一组链接 我可以在这些链接中始终使用抓取工具重现重定向错误 但在浏览器中访问时可以完美解决 我希望我能在这里找到一些见解
  • 为什么我无法与 GTX 480 和 CUDA 5 重叠数据传输和计算?

    我尝试将内核执行与 memcpyasync 重叠 但它不起作用 我遵循编程指南中的所有建议 使用固定内存 不同的流等 我看到内核执行确实重叠 但与内存传输无关 我知道我的卡只有一个复制引擎和一个执行引擎 但是执行和传输应该重叠 对吧 看来
  • 使用 VBA 将单元格格式化为任意货币,无论区域设置如何

    这真的让我很烦恼 因为它的工作方式似乎很不合逻辑 我有一个宏 可以使用一些代码将单元格格式化为货币来获取货币符号 这是涉及的代码 Dim sym As String sym reportConstants ISOcode Just use
  • 更改窗户的 Aero 玻璃颜色?

    我在用着DwmExtendFrameIntoClientArea在我的 WPF 应用程序中获得玻璃效果 这工作正常 我想做的是改变玻璃使用的颜色 我正在编写一个倒计时器 我希望窗口在大多数情况下都是正常的玻璃颜色 然后变成红色 但是仍然有玻
  • 如何在NotificationCompat.Builder.setLargeIcon()中加载Glide缓存图像?

    喜欢这张图片我正在尝试将通知大图标设置为用户个人资料缩略图 像 Whatsapp 或其他聊天应用程序 我努力了 Glide with context asBitmap load messageNotification getLargeIco
  • Swift 视频调整器 AVAsset

    我有这段代码可以将视频大小从 1280 x 720 调整为 640 x 360 但我想要调整大小而不裁剪 有没有办法完全调整大小而不裁剪 这是代码 class func resizer inputURL NSURL completion o
  • babel-preset-env 不使用 webpack 转译箭头函数

    我正在将 babel 与 webpack 一起使用 我试图使箭头函数与 Internet Explorer 一起使用 但我无法让它工作 这是我的包 json开发依赖 devDependencies babel core 6 26 3 bab
  • Android - 如何管理具有不同内容的单个片段的多个实例?

    我希望能够设置各个片段的视图的 setText 和 getText 就像现在一样 当我设置 Framgent 的 TextView 的文本时 它会更改所有片段中该视图的文本 我一直在尝试移动东西 但这是我目前的代码 片段类 public c
  • Python WX - 从 wx 对话框返回用户输入

    我是 Python 和 WX 的新手 我创建了一个简单的测试对话框 如下所示 用组合框提示用户 我想从主程序中的组合框中捕获值 我如何从我的主程序中调用它 这就是我打算如何调用它来显示对话框 但当前不捕获组合框中的值 import high
  • ArgumentParser:具有可选值的可选参数

    如果我有一个带有可选参数值的可选参数 有没有办法在未给出值时验证该参数是否已设置 例如 parser argparse ArgumentParser parser add argument abc nargs args parser par
  • OpenERP 始终显示继承视图而不是原始视图

    原始观点
  • SQL Server - 由于“ARITHABORT”而导致 INSERT 失败

    我使用 NHibernate 和 SQL Server 2005 并且在我的一张表的计算列上有一个索引 我的问题是 当我向该表插入一条记录时 出现以下错误 INSERT 失败 因为以下 SET 选项设置不正确 ARITHABORT I us
  • 从数据框中删除仅包含 0 或仅包含单个 0 的行

    我正在尝试在 R 中创建一个函数 该函数允许我根据行是否包含带有零的单列来过滤数据集 此外 有时我只想删除所有列中为零的行 另外 这就是有趣的地方 并非所有列都包含数字 并且列数可能会有所不同 我尝试将一些数据与我想要获得的结果粘贴到此处
  • 如何编写程序来查找某些单词是否相似?

    即 学院 和 学业 和 学院 属于同一集群 essay scholarships money 这些词也属于同一簇 这是 ML 或 NLP 问题吗 这取决于你的定义有多严格similar is 机器学习技术 As others已经指出 你可以
  • 如何在 laravel dompdf 中为每页添加页码?

    我从这里得到 https github com barryvdh laravel dompdf 我的控制器是这样的 public function listdata pdf PDF loadView print tests test pdf
  • 如何正确关闭数据源连接?

    我有这个类 但我不确定如何正确关闭连接 因为即使我只有 3 个用户登录但有多个 sql 查询 我仍然遇到此错误 gt com mysql jdbc exceptions jdbc4 MySQLNonTransientConnectionEx