JDBC异常处理和资源释放问题

以前咱们在介绍JDBC加载注册驱动的时候说过有三种方式,是哪三种方式呢?咱们再来看看mysql

Class.forName("com.mysql.jdbc.Driver");
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
以上三种方式均可以实现JDBC的驱动加载注册,这里咱们推荐使用Class.forName(“com.mysql.jdbc.Driver”);另外DriverManager.registerDriver(new com.mysql.jdbc.Driver());其实能够直接写成new com.mysql.jdbc.Driver();这里咱们了解就好,大可没必要深究,除非有必要!程序员

今天咱们来讲说JDBC链接数据库的异常的正确处理,还记得以前咱们是怎么处理的吗?没错,咱们直接给抛出了,代码是这个样子滴!
@Test
      public void ddlAndExceptionTest() throws Exception{
            String sql = "CREATE TABLE `t_student` (`id` bigint(10)  DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;";sql

            //加载注册驱动
            Class.forName("com.mysql.jdbc.Driver");数据库

            //获取链接对象
            Connection connection =  DriverManager.getConnection("jdbc:mysql:///jdbcdemo", "root",  "123456");.net

            //建立获取语句对象
            Statement st = connection.createStatement();对象

            //执行SQL语句
            st.executeUpdate(sql);blog

            //释放资源
            st.close();
            connection.close();资源

      }
咱们这里直接throws Exception了,其实这样是不妥的,那正确的异常处理方式是什么呢?在此以前咱们应该知道处理异常咱们都用try catch的,有时候也配合finally一块儿使用,在处理JDBC链接数据库的异常时咱们须要着重了解的还有资源释放的问题,就是那个xxx.close,下面咱们一步步结合代码来讲get

首先咱们看须要处理异常的代码io

诸如此类的代码异常咱们都将它使用try catch包裹
 //加载注册驱动
            try {
                  Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
而后将catch中的异常类型改成Exception,而后继续写代码,完成JDBC链接数据库的后续步骤,代码如

 try {
                  //加载注册驱动
                  Class.forName("com.mysql.jdbc.Driver");
                  //获取链接对象
                  Connection connection =  DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","123456");
                  //建立或者获取语句对象
                  Statement statement = connection.createStatement();
                  //执行sql语句
                  statement.executeUpdate(sql);
                  //释放资源
                  statement.close();
                  connection.close();

            } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            }
到这里咱们就已经将异常作了相应的处理,可是这里面还有个很大的问题那就是资源释放的问题,也就是说目前释放资源的代码放在那里是不妥的,若是以前代码出现个什么意外,那么资源就没法释放了,可能有人说了,为何这个资源必需要释放呢?

那么咱们就来讲道说道这个资源为何必须释放呢? 
咱们先来看这个Connection,这家伙是数据库的链接对象,你可要知道在JDBC中Connection这个资源是很是稀有的,使用以后必须立刻释放,我记得在哪看过关于这块释放资源的一个原则好像是“晚点用,早点放”,嗯,大概就是这个意思,总之在使用的过程当中只有用到的时候才去建立这个对象,使用以后也要记得立马释放。

所以,为了保证资源的必须释放,咱们该怎么作呢?没错,咱们能够将释放资源的代码放到finally里,这样就能够保证不管以前的代码怎样,释放资源的代码一定执行。

这样代码就变成了如今这个样子了
 @Test
      public void testException(){
            String sql = "CREATE TABLE `t_one` (`id` bigint(10) DEFAULT  NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
            Statement statement = null;
            Connection connection = null;
            try {
                  //加载注册驱动
                  Class.forName("com.mysql.jdbc.Driver");
                  //获取链接对象
                  connection =  DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","123456");
                  //建立或者获取语句对象
                  statement = connection.createStatement();
                  //执行sql语句
                  statement.executeUpdate(sql);
                  //释放资源
                  statement.close();
                  connection.close();

            } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
            } finally {
                  //释放资源
                  try {
                        statement.close();
                        connection.close();
                  } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                  }

            }


      }
到了这一步,你看看是否是就能够了呢?其实否则,这里面仍是不行,哪里不行呢?咱们来看,假如在connection没有来得及赋值的时候出现了意外,这样就会直接执行finally里面的代码,这样就会致使一个空对象调用close,就会引发新的异常致使程序崩溃,对于statement依然如此,所以,咱们须要进行判空!

所以finally里面释放资源的代码应该这样写


finally {
                  //释放资源
                  if (statement!=null) {
                        try {
                              statement.close();
                        } catch (SQLException e) {

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

                                          e.printStackTrace();
                                    }
                              }
                        }
                  }

            }
所以正确完整的代码以下


 //正确处理JDBC的异常
      @Test
      public void testHandleException(){

            Connection con = null;
            Statement st = null;
            String sql = "CREATE TABLE `t_new1` (`id` bigint(10) DEFAULT  NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;";

            //异常标准代码格式结构
            try{

                  //这里存放可能出现异常的代码
                  //加载注册驱动
                  Class.forName("com.mysql.jdbc.Driver");
                  //获取链接对象
                  con =  DriverManager.getConnection("jdbc:mysql:///jdbcdemo","root","123456");
                  //获取链接语句
                  st = con.createStatement();
                  //执行sql语句
                  st.executeUpdate(sql);

            }
            catch (Exception e) {

                  e.printStackTrace();             }finally {                   //释放资源、                   if (st!=null) {                         try {                               st.close();                         } catch (Exception e2) {                               // TODO: handle exception                         }finally {                               if (con!=null) {                                     try {                                           con.close();                                     } catch (Exception e3) {                                           // TODO: handle exception                                     }                               }                         }                   }             }            } ---------------------  做者:一个自学的程序员  来源:CSDN  原文:https://blog.csdn.net/sinat_33921105/article/details/79497823  版权声明:本文为博主原创文章,转载请附上博文连接!

相关文章
相关标签/搜索