|
539.请列出Java常见的开源数据连接池,并对参数做出简单的说明
答:在Java中开源的常用的数据库连接池有以下几种 :
(1)DBCP
DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP。
(2)c3p0
c3p0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
(3)Druid
阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。
540.储蓄所有多个储户,储户在多个储户所存取款,储蓄所与储户之间是()
A.一对一的联系B.多对一的联系C.一对多的联系D.多对多的联系
答案:D
541.视图是一个“虚表”,视图的构造基于()
A.基本表或视图B.视图C.数据字典D.基本表
答案:A
542.设有关系R(A,B,C,D)及其上的函数相关性集合F={B→A,BC→D},那么关系R最高是()
A.第一范式的B.第二范式的C.第三范式的D.BCNF范式的
答案:A
分析: 根据数据库三大范式的依赖性要求,从B,BC函数确定A和D这一点上,明显看出B,BC都有可能是主码. 若B是主码的话,仔细看会发现,F中竟然没有谁去函数确定C,这显然是说不通的,(因为C至少会被B这个主码函数确定); 若BC是主码,那么F中存在非主属性对候选码的部分依赖,不满足第二范式的要求,故为第一范式.
543.什么是DAO模式?
答:DAO(DataAccess Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露数据库实现细节的前提下提供了各种数据操作。为了建立一个健壮的Java EE应用,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储。DAO模式实际上包含了两个模式,一是Data Accessor(数据访问器),二是Data Object(数据对象),前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。
544.数据库MySQL,Oracle,SqlServer分页时用的语句
Mysql:使用limit关键字
Select * from 表名 where 条件 limit 开始位置,结束位置。通过动态的改变开始和结束位置的值来实现分页。
Oracle:通过rownum来实现
select * from ( select rownum rn,t.* from addressbook where rownum<= 20 ) where rownum > 10
Sqlserver:
select top 20 * from addressbook where id not in (select top 10 id from addressbook)
545.Oracle完成分页功能的三层子查询语句及其含义?
如:select * from (select t.*,rownum r from (select * from A) t where rownum < 10) where r >5
select * from A:要查询的数据
select t.*,rownum r from (select * from A) t where rownum < 10:取前10行
select * from (select t.*,rownum r from (select * from A) t where rownum < 10) where r >5:取5-10行
546.问SQL怎么优化执行效率更高
答: 1. SQL优化的原则是:将一次操作需要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量。
调整不良SQL通常可以从以下几点切入:
1) 检查不良的SQL,考虑其写法是否还有可优化内容
2) 检查子查询 考虑SQL子查询是否可以用简单连接的方式进行重新书写
3) 检查优化索引的使用
4) 考虑数据库的优化器
2. 避免出现SELECT * FROM table 语句,要明确查出的字段。
3. 在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。
4. 查询时尽可能使用索引覆盖。即对SELECT的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。
5. 在判断有无符合条件的记录时建议不要用SELECT COUNT (*)和select top 1 语句。
6. 使用内层限定原则,在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句的最里层进行限定,以减少数据的处理量。
7. 应绝对避免在order by子句中使用表达式。
9. 小心使用 IN 和 OR,需要注意In集合中的数据量。建议集合中的数据不超过200个。
10. <> 用 < 、 > 代替,>用>=代替, < 用< =代替,这样可以有效的利用索引。
11. 在查询时尽量减少对多余数据的读取包括多余的列与多余的行。
12. 对于复合索引要注意,例如在建立复合索引时列的顺序是F1,F2,F3,则在where或order by子句中这些字段出现的顺序要与建立索引时的字段顺序一致,且必须包含第一列。只能是F1或F1,F2或F1,F2,F3。否则不会用到该索引。
547.谈谈数据库去空格的情况
一、表中字符串带空格的原因
1、空格就是空格。
2、控制符 显示为 空格。
二、解决方法
第一种情况,去空格的处理的比较简单,Replace(column,&#39; &#39;,&#39;&#39;) 就可以解决。
第二种情况,解决方法就比较麻烦点:需要先查出相应的ASCII码,再用Replace(column,char(ascii码),&#39;&#39;)解决,以下举个栗子:
CREATE TABLE #temp
(NAME NVARCHAR(50))
INSERT INTO #temp SELECT &#39;明天就是国庆了&#39;+CHAR(10) --换行符
SELECT * FROM #temp --末尾显示为空格
SELECT REPLACE(NAME,&#39; &#39;,&#39;&#39;) FROM #temp --去不掉这个空格
SELECT REPLACE(NAME,CHAR(10),&#39;&#39;) FROM #temp --去掉空格
SELECT REPLACE(NAME,CHAR(ASCII(RIGHT(NAME,1))),&#39;&#39;) FROM #temp --在不知道是最后一位是什么字符导致空格的情况下,先转ASCII码,在替换
DROP TABLE #temp
----下面是查询结果:
--&#39;明天就是国庆了 &#39;
--&#39;明天就是国庆了 &#39;
--&#39;明天就是国庆了&#39;
--&#39;明天就是国庆了&#39;
548.根据你以往的经验简单叙述一下MYSQL的优化
答:
1.数据库的设计
尽量把数据库设计的更小的占磁盘空间.
1).尽可能使用更小的整数类型.(mediumint就比int更合适).
2).尽可能的定义字段为not null,除非这个字段需要null.
3).如果没有用到变长字段的话比如varchar,那就采用固定大小的纪录格式比如char.
4).表的主索引应该尽可能的短.这样的话每条纪录都有名字标志且更高效.
5).只创建确实需要的索引。索引有利于检索记录,但是不利于快速保存记录。如果总是要在表的组合字段上做搜索,那么就在这些字段上创建索引。索引的第一部分必须是最常使用的字段.如果总是需要用到很多字段,首先就应该多复制这些字段,使索引更好的压缩。
6).所有数据都得在保存到数据库前进行处理。
7).所有字段都得有默认值。
8).在某些情况下,把一个频繁扫描的表分成两个速度会快好多。在对动态格式表扫描以取得相关记录时,它可能使用更小的静态格式表的情况下更是如此。
2.系统的用途
1).尽量使用长连接.
2).explain 复杂的SQL语句。
3).如果两个关联表要做比较话,做比较的字段必须类型和长度都一致.
4).LIMIT语句尽量要跟order by或者 distinct.这样可以避免做一次full table scan.
5).如果想要清空表的所有记录,建议用truncate table tablename而不是delete from tablename.
6).能使用STORE PROCEDURE 或者 USER FUNCTION的时候.
7).在一条insert语句中采用多重纪录插入格式.而且使用load data infile来导入大量数据,这比单纯的indert快好多.
8).经常OPTIMIZE TABLE 来整理碎片.
9).还有就是date 类型的数据如果频繁要做比较的话尽量保存在unsigned int 类型比较快。
3.系统的瓶颈
1).磁盘搜索.
并行搜索,把数据分开存放到多个磁盘中,这样能加快搜索时间.
2).磁盘读写(IO)
可以从多个媒介中并行的读取数据。
3).CPU周期
数据存放在主内存中.这样就得增加CPU的个数来处理这些数据。
4).内存带宽
当CPU要将更多的数据存放到CPU的缓存中来的话,内存的带宽就成了瓶颈.
549.以Oracle11R为例简述数据库集群部署
命令行工具
–crsctl管理集群相关的操作:
-启动和关闭Oracle集群
-启用和禁用Oracle集群后台进程
-注册集群资源
-srvctl 管理Oracle 资源相关操作
-启动和关闭数据库实例和服务
在Oracle Grid安装的home路径下的命令行工具crsctl和srvctl用来管理Oracle集群。使用crsctl可以监控和管理任何集群节点的集群组件和资源。srvctl工具提供了类似的功能,来监控和管理Oracle相关的资源,例如数据库实例和数据库服务。crsctl命令只能是集群管理者来运行,srvctl命令可以是其他用户,例如数据库管理员来使用。
550.说一下数据库的存储过程?
一、存储过程与函数的区别:
1.一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
2.对于存储过程来说可以返回参数(output),而函数只能返回值或者表对象。
3.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
二、存储过程的优点:
1.执行速度更快 – 在数据库中保存的存储过程语句都是编译过的
2.允许模块化程序设计 – 类似方法的复用
3.提高系统安全性 – 防止SQL注入
4.减少网络流通量 – 只要传输存储过程的名称
系统存储过程一般以sp开头,用户自定义的存储过程一般以usp开头
551.数据库创建索引的缺点?
缺点:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 |
|