精华内容
下载资源
问答
  • 用Java关闭数据库连接
    2021-01-19 17:44:38

    当你用完你的Connection,您需要显式地关闭它,方法是调用它的close()方法以释放任何其他数据库资源(游标、句柄等)。

    实际上,Java中的安全模式是关闭ResultSet, Statement,和Connection(按该顺序)finally当你和他们在一起的时候阻止他们,就像这样:Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {

    // Do stuff

    ...} catch (SQLException ex) {

    // Exception handling stuff

    ...} finally {

    if (rs != null) {

    try {

    rs.close();

    } catch (SQLException e) { /* ignored */}

    }

    if (ps != null) {

    try {

    ps.close();

    } catch (SQLException e) { /* ignored */}

    }

    if (conn != null) {

    try {

    conn.close();

    } catch (SQLException e) { /* ignored */}

    }}

    这个finally块可以稍微改进为(以避免空检查):} finally {

    try { rs.close(); } catch (Exception e) { /* ignored */ }

    try { ps.close(); } catch (Exception e) { /* ignored */ }

    try { conn.close(); } catch (Exception e) { /* ignored */ }}

    但是,这仍然非常冗长,因此您通常会使用帮助类来关闭空安全助手方法中的对象,而finally区块变成了这样的东西:} finally {

    DbUtils.closeQuietly(rs);

    DbUtils.closeQuietly(ps);

    DbUtils.closeQuietly(conn);}

    更多相关内容
  • * 数据库连接池特点: * 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接...
  • 在Java中关闭数据库连接

    千次阅读 2021-02-25 19:19:31
    使用连接完成后,您需要通过调用其close()方法显式关闭它,以释放连接可能持有的任何其他数据库资源(游标,句柄等)。实际上,Java中的安全模式是在完成它们后,在finally块中关闭ResultSet,Statement和Connection...

    使用连接完成后,您需要通过调用其close()方法显式关闭它,以释放连接可能持有的任何其他数据库资源(游标,句柄等)。

    实际上,Java中的安全模式是在完成它们后,在finally块中关闭ResultSet,Statement和Connection(按此顺序),如下所示:

    Connection conn = null;

    PreparedStatement ps = null;

    ResultSet rs = null;

    try {

    // Do stuff

    ...

    } catch (SQLException ex) {

    // Exception handling stuff

    ...

    } finally {

    if (rs != null) {

    try {

    rs.close();

    } catch (SQLException e) { /* ignored */}

    }

    if (ps != null) {

    try {

    ps.close();

    } catch (SQLException e) { /* ignored */}

    }

    if (conn != null) {

    try {

    conn.close();

    } catch (SQLException e) { /* ignored */}

    }

    }

    finally块可以稍微改进(避免空检):

    } finally {

    try { rs.close(); } catch (Exception e) { /* ignored */ }

    try { ps.close(); } catch (Exception e) { /* ignored */ }

    try { conn.close(); } catch (Exception e) { /* ignored */ }

    }

    但是,这仍然是非常冗长,所以你通常最终使用一个帮助类关闭对象在安全的安全助手方法和finally块成为这样:

    } finally {

    DbUtils.closeQuietly(rs);

    DbUtils.closeQuietly(ps);

    DbUtils.closeQuietly(conn);

    }

    展开全文
  • 数据库资源关闭顺序

    2021-12-05 00:22:30
    创建的顺序: Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement ps= conn.prepareStatement(sql);...关闭顺序: finally { if (rs != null) { try { ...

    创建的顺序:

    Connection conn = DriverManager.getConnection(url, user, password);

    PreparedStatement ps = conn.prepareStatement(sql);

    ResultSet rs = ps.executeQuery(sql);

    关闭的顺序:

     finally {
                    if (rs != null) {
                            try {
                                    rs.close();
                            } catch (SQLException e) {
                                    e.printStackTrace();
                            }
                    }
                    if (ps != null) {
                            try {
                                    ps.close();
                            } catch (SQLException e) {
                                    e.printStackTrace();
                            }
                    }

                    if (conn != null) {
                            try {
                                    conn.close();
                            } catch (SQLException e) {
                                    e.printStackTrace();
                            }
                    }
            }

    如果connection关闭了,后面Statement和ResultSet相关的操作就会受到影响。所以平时一定要注意关闭资源的先后顺序,先关闭ResultSet,然后是Statement,最后是Connetion,刚好与创建相应对象时的顺序相反。

    展开全文
  • 我们经常会遇到这样那样的连接关闭的问题,连接没有及时关闭导致的直接后果就是内存泄漏直至down机。我们也都知道解决的方式,但是在解决了问题之后经常会思考为什么会这样呢?连接close()掉,然后在创建不是很...

    我们经常会遇到这样那样的连接未关闭的问题,连接没有及时关闭导致的直接后果就是内存泄漏直至down机。我们也都知道解决的方式,但是在解决了问题之后经常会思考为什么会这样呢?连接close()掉,然后在创建不是很浪费cpu等系统资源嘛?有没有更好的方法解决呢?大家也经常听到连接池、线程池之类的线程、池的概念,那么究竟这些概念与我们的连接有什么关系呢?

    下面我就想就上面的问题谈谈我的一点浅见,请大家批评指正。

    大家都知道java语言是一种语言级的多线程机制的面向对象语言。比如说,java的基类object,它就有一些诸如wati(),notify(),notifyall()等线程控制的方法。如果大家学习过操作系统的化,我想应该知道线程存在同步和异步的问题,解决的方法很多,其中就有“信号量机制”实现线程的同步,java的这种同步机制与操作系统大同小异。同步机制是一个比较复杂的问题,如果感兴趣可以找一本操作系统的书看看。

    下面简单介绍一些进程和线程的概念:

    1.进程:

    进程是资源分配和独立运行的基本单位。进程的定义很多,下面列举一些

    Ø进程是程序的一次执行;

    Ø进程是可以和别的计算机并发执行的计算;

    Ø进程可定义为一个数据结构及能在其上进行操作的一个程序

    Ø进程是一个程序及其数据在处理机上顺序执行时发生的活动;

    Ø进程时程序在一个数据集合上的运行过程,时系统进行资源分配和调度的一个独立单位。

    2.线程

    由于进程是一个资源拥有者,因而在进程的创建、撤消和切换过程中,系统必须为之付出较大的时空开销。也正因为如此,在系统中所设置的进程数目不宜过多,进程切换的频率也不宜过高,但这也就限制了并发程度的进一步提高。因此便引出了线程的概念

    把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位,使传统进程的两个属性分开,线程便能轻装运行,从而显著提高系统的并发程度。

    Ø在同一个进程内可以有多个线程;

    Ø同一个进程内的线程切换不会引起进程切换;

    Ø一个进程的线程切换到另一个进程的线程时会引起进程切换

    3.JSP/SERVLET

    而我们常用的jsp/ervlet这种j2ee的体系结构正是建立在java的多线程机制之上的。JSP/SERVLET容器会自动使用线程池等技术来支持系统的运行。因此,JSP/SERVLET的实质是一种线程技术,JSP会在运行时被编译成servlet来运行,如图所示:

    当客户端向服务器发出一个请求时,servlet容器会分配一个线程专门处理这个请求,线程内容就是JSP/servlet应用程序。

    这部分内容与本主体无关,只是顺便说说。

    4.线程池

    首先介绍一下线程池:

    线程的创建和销毁,以及切换,执行都是要耗费系统资源的。当系统访问量比较大的时候,服务器内就会创建太多的线程,直至资源完全消耗,这对于应用系统的正常运行是有致命伤害的。

    为了能够在访问尖峰时限制活动线程的数量,同时减少线程频繁创建和销毁带来的系统开销,提高系统的大访问量的处理性能和速度,需要事先创建一定数量的线程供调用者循环反复使用,这就是“池”技术。

    线程的基本原理是基于队列queue这种数据结构的,通过不断查询队列queue是否有可以运行的线程。如果有,就立即运行线程,没有,则锁定等待,直到有新的线程加入被解锁。(这种锁定机制,就是所谓的“信号量机制”)。

    一种线程池必须解决如下的问题:死锁、资源不足、并发错误、线程泄漏和请求过载。下面我们具体举一个成熟的开源线程池的例子来说明线程池的原理:

    PooledExecutor pool=new PooledExecutor(new BoundedBuffer(20),100);

    pool.setMinimumPoolSize(10);//最小线程数为10

    poole.setKeepAliveTime(-1);//线程一直运行

    上面的语句设置了线程的最大数目为100,这样,就可以保护系统不会因为访问量增加导致线程数目的无限增加。使用该线程池如下:

    pool.execute(java.lang.Runnable自己的线程);

    这一句实际上是将“自己的线程”加入一个队列中,而队列(先进先出FIFO)另一段正开启多个线程不断读取这个队列,一旦队列中有空闲的线程,线程管理器就将读取并分配线程来运行它。

    public void execute(Runnable command) throws InterruptedException {

    for (;;) { //一直循环

    synchronized (this) {

    if (!shutdown_) { //确保线程池没有关闭

    int size = poolSize_; //当前线程池中线程的数目

    if (size 

    addThread(command);

    return;

    }

    //如果目前线程池中有超过或等于最小数目的线程

    //分配一个存在的空闲线程来运行command,handOff是队列

    if (handOff_.offer(command, 0)) {

    return;

    }

    //如果不能分配已有的线程来运行command,那么创建一个新线程

    if (size 

    addThread(command);

    return;

    }

    }

    }

    //如果阻塞,则请求帮助

    if (getBlockedExecutionHandler().bolckedAction(command)) {

    return;

    }

    }

    }

    由上面的代码可见,PooledExecutor线程池的原理是,当执行execute加载一个应用系统的线程时,线程池内部首先检查当前线程数目是否达到设定的最小数目。如果没有达到,启动新线程运行;如果达到了,那么检查有无空闲线程可用;如果没有空闲的,则创建新线程,直到达到最大数目。

    使用线程池的好处是:首先是循环使用,一经创建后,空闲的线程可以被反复使用,提高了运行效率;其次有最大数目的限制,保证了系统的安全性。

    5.连接池

    终于轮到连接池了,通过上面的介绍,我们对线程及线程池都有个一个大致的了解。

    在正常情况下,直接使用JDBC调用数据库可以满足一个小型系统的要求,但是当系统规模比较大的情况下,就会出现数据库的访问量迅速提升而令服务器不堪重负的现象,因而为了解决这一性能问题,常常会使用数据库连接池作为一个缓存的方式解决。

    连接池类似上面介绍的线程池。

    每次数据库连接的建立都需要花费一定的时空费用,而使用连接池,可以事先建立连接。当应用程序需要开始使用时,就从连接池中获取一个连接使用,应用程序使用完毕,通过close()方法将连接归还连接池。讲到这里,我门就不必在担心close()方法会不会影响性能了,完全可以放心大胆的使用。因为,它实际上并没有关闭连接,而是将连接归还连接池,供下次使用。

    当并发增加是,连接池会不断的自动创建新的连接满足调用,直到达到连接池的最大数目;当连接池连接减少甚至没有时,连接池自动关闭一些连接,保持最小数目。

    因此连接池的使用节省了连接建立时间,消除了数据库频繁连接带来的开销和瓶颈。

    小提示:不知道大家有没有注意到配置websphere时有关于连接池最大最小数目的配置。呵呵,道理就在这。

    那么,我们经常面对的连接未关闭的问题导致的系统速度很慢的问题就很容易说明了,就是因为线程池已经达到了最大数目,没有可用的了。所以,其他操作只有等待的份,等待那些应用用完了,被垃圾回收了,才能释放出可用的连接。

    展开全文
  • 数据库连接由数据库拥有和管理,该类只允许您访问该数据库资源.如果不关闭连接,那么Java类可能被垃圾收集,但数据库可能无法告知连接不再使用,这可能导致数据库资源被浪费(直到数据库端超时) )甚至泄漏.因此,当您完成...
  • 在JDBC连接数据库时首先要获得connection,再通过它获得相应的statement,最后获得结果集resultset.这些过程都会占用内存资源,所以我们常常会在方法调用结束后关闭相应的资源节约内存空间。这时如果关闭顺序不对,...
  • 数据库连接池基本使用步骤
  • 数据库连接

    2022-02-11 16:48:34
    什么是数据库连接数据库连接池(connection pool)是程序启动时建立多个数据库连接,并将这些连接组成一个连接池,统一进行管理,由程序动态地对池中的链接进行申请,使用,释放。 为什么使用连接池 资源复用 ...
  • MySQL客户机主要用于传递SQL查询给...所以MySQL在认定身份中会考虑你的主机名和登录的用户名称,只有客户机所在的主机被授予权限才能去连接MySQL服务器。启动操作系统命令后,连接MySQL服务器可以使用如下命令:my...
  • 这个连接是与数据库服务器的一个连接,虽然你的方法结束了,但是这个资源依然存在数据库连接并没有释放提问: 为什么在JDBC对数据库访问结束后,要按先关闭ResultSet,然后关闭PreparedStatement,最后关闭...
  • 使用数据库连接池可以减少打开新连接的次数,并且将物理数据库的连接交给了池程序去做。 池程序是通过为每个特定的连接配置保持一组活动的连接对象来管理数据库连接的。每当应用程序发起连接数据库的请求时,池程序...
  • 数据库连接技术 - JDBC

    2021-11-23 20:32:11
    一、JDBC 数据库连接技术的认识 JDBC是什么?JDBC英文名为:Java Data Base Connectivity(Java数据库连接),官方解释它是Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API,根本上说JDBC是一种规范...
  • 本篇内容综合广大网友提供内容,笔者经过整理,对数据库连接池原理和实现过程做个很系统的并且通俗易懂的分析讲解,以及手写一个连接池实现过程作为演示。 一、早期通过JDBC方式操作数据库 我们先来看早期使用JDBC...
  • 数据库——连接池(特点及步骤)

    千次阅读 多人点赞 2021-12-07 11:38:00
    数据库连接池的优点 实现方法 连接步骤:①导入jar包,②测试连接代码,③写配置文件 QueryRunner插入操作 QueryRunner查询操作 概念 传统连接的问题 数据库连接池的优点 提高程序的响应速度(减少...
  • SQL数据库连接方法,包括连接和关闭,以及一系列的重载方法
  • 数据库连接数测试2. 透过现象看原理3. 如何合理设置数据库连接数 1. 数据库连接数测试         假如你有一个网站,压力有个1万上下的并发访问——也就是说差不多2万左右...
  • JDBC-数据库连接关闭的方式

    千次阅读 2019-06-11 18:40:07
    建立数据库连接 Connection c = DriverManager.getConnection(url, name, psw); //3.执行sql语句(insert,update,delete,select) Statement s = c.createStatement(); String sql = "insert into hero values...
  • java与sqlerver 数据库连接

    千次阅读 2021-12-07 13:00:49
    eclipse中的程序去连接sqlserver数据库的步骤 (sqljdbc.jar)这个jdbc需要的可以加我,发给你 1.连接前的准备工作 ①打开服务,打开数据库软件,进行登录 ②进行建数据库,创表 ③打开eclipse,创建Java项目...
  • 项目——C++实现数据库连接

    千次阅读 2022-03-26 15:04:46
    前言 在学习Mysql的时候,我们都有这个常识:对于DB的操作,其实本质上是对于磁盘的操作,如果对于DB的访问次数过多,其实就是涉及了大量的磁盘IO,...Mysql Server的连接认证,Mysql Server关闭连接回收资源和TCP四次
  • 正确顺序是 rs,st,conn 正确顺序是 rs,st,conn 正确顺序是 rs,st,conn 正确顺序是 rs,st,conn 正确顺序是 rs,st,conn
  • 文章目录Golang 侧数据库连接池原理和参数调优数据库连接数据库连接池的设计Go 的数据库连接池Go 数据库连接池的设计建立连接释放连接清理连接配置 sql.DB 以获得更好的性能maxOpenmaxIdlemaxLifeTime在实践和压测...
  • 案例分析(四):高性能数据库连接池HiKariCP1. 什么是数据库连接池2. FastList 解决了哪些性能问题3. ConcurrentBag 解决了哪些性能问题4. 总结   实际工作中,我们总会难免和数据库打交道;只要和数据库打交道,...
  • JDBC与数据库连接

    万次阅读 多人点赞 2018-10-24 23:58:23
    JDBC简介,driver类型,JDBC连接,使用技巧; 连接,短连接,长连接连接池; 池化思想; 配置,基本配置,关键配置,性能配置; 连接池工具; druid; HikariCP; flexy-pool;
  • JAVA数据库连接(JDBS)

    千次阅读 2021-07-06 22:17:40
    JDBC(Java DataBase Connectivity), 即java数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的...
  • 数据库连接的使用过程中,必须要满足独占性要求(其他线程不能访问),使用完成后关闭数据库连接,那么问题来了,数据库都已经连接关闭了,那其他线程又怎么使用呢? 带着这样的疑问,我们一起阅读了“org.apache....
  • 使用数据库连接池的好处

    千次阅读 2017-11-25 16:26:59
    对于一个简单的数据库应用,由于对于数据库的访问不是很频繁。这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭...通过建立一个数据库连接池以及一套连接使用管理策略,使得一个数据库连接可以得到高
  • java连接数据库详解

    2021-03-14 18:16:38
    JDBC连接数据库•创建一个以JDBC连接数据库的程序,包含7个步骤:1、加载JDBC驱动程序:在连接数据库之前,首先要加载想要连接数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 176,439
精华内容 70,575
关键字:

关闭数据库连接的顺序