JDBC面试题都在这里(二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 以下我是归纳的JDBC知识点

说说数据库连接池工作原理和实现方案?


说说数据库连接池工作原理和实现方案?

工作原理:

  • JAVA EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

实现方案:连接池使用集合来进行装载,返回的Connection是原始Connection的代理,代理Connection的close方法,当调用close方法时,不是真正关连接,而是把它代理的Connection对象放回到连接池中,等待下一次重复利用。

具体代码:

@Override

   publicConnectiongetConnection()throwsSQLException{


       if(list.size()>0){

           finalConnectionconnection=list.removeFirst();


           //看看池的大小

           System.out.println(list.size());


           //返回一个动态代理对象

           return(Connection)Proxy.newProxyInstance(Demo1.class.getClassLoader(),connection.getClass().getInterfaces(),newInvocationHandler(){


               @Override

               publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{


                   //如果不是调用close方法,就按照正常的来调用

                   if(!method.getName().equals("close")){

                       method.invoke(connection,args);

                   }else{


                       //进到这里来,说明调用的是close方法

                       list.add(connection);


                       //再看看池的大小

                       System.out.println(list.size());


                   }

                   returnnull;

               }


           });

       }

       returnnull;

   }


Java中如何进行事务的处理?


Java中如何进行事务的处理?

  1. 事务是作为单个逻辑工作单元执行的一系列操作
  2. 一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务

Connection类中提供了4个事务处理方法:

  • setAutoCommit(Boolean autoCommit):设置是否自动提交事务,默认为自动提交,即为true,通过设置false禁止自动提交事务;
  • commit():提交事务;
  • rollback():回滚事务.
  • savepoint:保存点
  • 注意:savepoint不会结束当前事务,普通提交和回滚都会结束当前事务的



修改JDBC代码质量

下述程序是一段简单的基于JDBC的数据库访问代码,实现了以下功能:从数据库中查询product表中的所有记录,然后打印输出到控制台.该代码质量较低,如没有正确处理异常,连接字符串以”魔数”的形式直接存在于代码中等,请用你的思路重新编写程序,完成相同的功能,提高代码质量.

原来的代码:

publicvoidprintProducts(){

   Connectionc=null;

   Statementss=null;

   ResultSetr=null;

   try{


c=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:sid","username","password");

       s=c.createStatement();

       r=s.executeQuery("select id, name, price from product");

       System.out.println("Id\tName\tPrice");

       while(r.next()){

           intx=r.getInt("id");

           Stringy=r.getString("name");

           floatz=r.getFloat("price");

           System.out.println(x+"\t"+y+"\t"+z);

       }

   }catch(Exceptione){


   }

}

修改后的代码:

classConstant{

   publicstaticfinalStringURL="jdbc:oracle:thin:@127.0.0.1:1521:sid";

   publicstaticfinalStringUSERNAME="username";

   publicstaticfinalStringPASSWORD="password";

}


classDAOExceptionextendsException{

   publicDAOException(){

       super();

   }

   publicDAOException(Stringmsg){

       super(msg);

   }

}


publicclassTest{


   publicvoidprintProducts()throwsDAOException{

       Connectionc=null;

       Statements=null;

       ResultSetr=null;

       try{

           c=DriverManager.getConnection(Constant.URL,Constant.USERNAME,Constant.PASSWORD);

           s=c.createStatement();

           r=s.executeQuery("select id,name,price from product");

           System.out.println("Id\tName\tPrice");

           while(r.next()){

               intx=r.getInt("id");

               Stringy=r.getString("name");

               floatz=r.getFloat("price");

               System.out.println(x+"\t"+y+"\t"+z);

           }

       }catch(SQLExceptione){

           thrownewDAOException("数据库异常");

       }finally{

           try{

               r.close();

               s.close();

               c.close();

           }catch(SQLExceptione){

               e.printStackTrace();

           }

       }

   }

}

修改点:

  • url、password等信息不应该直接使用字符串“写死”,可以使用常量代替
  • catch中应该回滚事务,抛出RuntimeException也是回滚事务的一种方法
  • 关闭资源



写出一段JDBC连接本机MySQL数据库的代码

写出一段JDBC连接本机MySQL数据库的代码

Class.forName("com.mysql.jdbc.Driver");

Stringurl="jdbc:mysql://localhost/test";

Stirnguser='root';

Stringpassword='root';

Connectionconn=DriverManager.getConnection(url,user,passwo

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5月前
|
SQL 安全 Java
Java面试题:什么是JDBC以及如何在Java中使用它进行数据库操作?
Java面试题:什么是JDBC以及如何在Java中使用它进行数据库操作?
55 0
|
5月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
73 0
|
7月前
|
存储 JavaScript 前端开发
JDBC六部曲(二)_jdbc创建状态参数,2024年最新面试基本问题及答案
JDBC六部曲(二)_jdbc创建状态参数,2024年最新面试基本问题及答案
|
存储 SQL Java
Java面试题之数据库与JDBC 部分
106、有 3 个表(15 分钟):【基础】 Student 学生表 (学号,姓名,性别,年龄,组织部门) Course 课程表 (编号,课程名称 Sc 选课表 (学号,课程编号,成绩) 表结构如下:
36 0
|
Oracle Java 关系型数据库
玩转Java面试-什么是Java的JDBC?
Java的JDBC(Java Database Connectivity)是一种用于与数据库进行交互的API(Application Programming Interface)。
|
SQL Java 关系型数据库
JDBC面试核心必考知识点
JDBC核心知识点 如有编辑错误联系作者 如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 王恒杰 男、95后 现居天津 是一名学习java的菜鸟 是万千程序猿中的一只 喜欢编程,喜欢探索新技术,大学生活迷茫过,失落过,还好没有放弃 希望看到这里的你也不要轻易地放弃 这条路上的你并不是孤军奋战,有千千万万的猿在陪你前行
158 0
JDBC面试核心必考知识点
|
Java 数据库连接 开发者
java面试题:在Spring框架中如何更有效地使用JDBC?
java面试题:在Spring框架中如何更有效地使用JDBC?
java面试题:在Spring框架中如何更有效地使用JDBC?
|
Java 数据库连接 数据库
java面试题:解释JDBC抽象和DAO模块?
java面试题:解释JDBC抽象和DAO模块?
java面试题:解释JDBC抽象和DAO模块?
|
SQL 存储 Oracle
【面试专题】2022 年 30 大 JDBC 面试问题和答案
【面试专题】2022 年 30 大 JDBC 面试问题和答案
|
SQL 缓存 Oracle
一个基础又很重要的知识点:JDBC原理(基本案例和面试知识点)
JDBC全称又叫做Java DataBase Connectivity,就是Java数据库连接,说白了就是用Java语言来操作数据库。这篇文章主要是对JDBC的原理进行讲解。不会专注于其使用。主要是理解其思想并对一些常见的面试题进行讲解。
314 0
一个基础又很重要的知识点:JDBC原理(基本案例和面试知识点)
下一篇
DataWorks