JDBC性能优化技巧
如果可能,避免访问数据库
此条在ESM中的表现就是对职员信息的访问,能从Session中读取的总是尽可能从Session中读取,数据库的操作总是尽量避免。
对数据库使用连接池并且重用连接,而不要重复打开和关闭连接。最佳的连接池大小是当连接池大到足够使服务请求不等待
“池”及类似的概念是所有高性能系统所必备的部件,比如硬盘及光盘驱动器的预读取策略
Prepared statement 池(自从 JDBC3.0 开始有)高速缓存已经预先优化并运行了的 SQL 查询,这样,他们被再次请求的时候,不必经历再次的优化预处理(避免最优化步骤,诸如检查语法,验证地址,优化访问路径和执行计划)。 Statement 池是一个很好的,重要的性能优化方法
JDBC3.0 中的 Statement 池和连接池能合作共享 statement 池,这样,能使用一个已高速缓存的 statement (该 statement 来自另外一个连接)的连接,在由任一连接执行的 一些SQL 首次被执行时,产生的 statement 准备开销仅一次
RowSet对象与 ResultSet 对象相似,但是能提供当断开连接的时候对数据库数据的访问。这允许数据以它最简单的形式被高效的高速缓存
这个特性不知有何用处?
用同一个连接执行多个 statements
在ESM中,一次(http)请求连接只打来一个Connection,所有的Statement都位于这一个Connection中,当断开(http)连接的时候,才会提交所有事务。
关闭 autocommit ,但不要让事务打开太久
ESM中即采取了此策略。
避免将事务分布开(事务跨越多个连接)
最小化数据库的行和列数据获取。使用 setMaxRows, setMaxFieldSize,和 SetFetchSize
使用最高效的数据类型:字符串比整数型快,整数型比浮点类型和时间戳类型都要高效(是否不太理解^&^,这是针对DB2数据库处理来说的,处理character类型最快,而处理integer类型通常需要一些转换或者字节排序)
使用 updateXXX()方法更新: updateXXX() 在可更新的结果集上调用。结果集已经定位到了一行 , 因此当使用一个 UPDATE statement 时,可以消除通常的查找要更新的数据行的开销
Cache任何请求的元数据( metadata )并尽可能少的使用元数据 方法,其慢的程度一用便知
避免在元数据 查询中使用 null 参数
使用虚拟查询获得一行的元数据,不要使用getcolumns()(假如应用允许用户使用列数据,应用是使用getColumns来返回列的信息给用户还是准备一个虚拟查询而后调用getMetadata呢?
使用存储过程,避免多余的网络传输
在存储过程中使用参量,不要将数据挨个地放在statement中,最小化解析开销。此条针对DB2来说,其它数据库未必适用。SQL总是以字符串形式发送给DB2数据库,例如:
CallableStatement cstmt = conn.prepareCall (“call getCustName (12345)”);
ResultSet rs = cstmt.executeQuery ();
DB2服务器必须解析该SQL,验证参量类型,并将参量转化为正确的数据类型。
对需要重复执行的statement使用预处理statement(PreparedStatement)
选择使用最佳游标:对连续读取使用游标;对双向滚动使用游标。对仅返回一行的查询避免使用游标。
在JVM中Cache频繁请求的数据,避免不必要的数据库请求
采用预读取机制, 批量取行,而不要一次一行 。调整批大小和预取行的数量。避免使用预取 BLOB 数据。
除非绝对需要,否则避免移动数据
在数据穿过网络之前要使流化数据( Streamline data )
避免每次处理一行,尽可能一起处理多行。
在表中统计个数(例如:使用 select count(*) from myTable,yourTable where …)属于资源密集型的。试试首先选入临时表,仅返回该计数(count),然后发送精确的二次查询获得临时表中的行的子集。
恰当的使用 SQL 能减少资源请求。使用返回所需数据的最小值的查询:避免 select * 查询。一个返回小的数据子集的复杂查询,比一个简单的,返回超过所需的大量数据的简单查询更高效。
使你的查询尽可能精巧,例如:尽可能精确地最小化要传输的数据,使其是所需的子集
努力批量更新:将 statement 收集到一起,然后在一个事务里面一起执行。如果可能,使用有条件的逻辑和临时变量来达到 statement 批处理
永远不要让 DBMS 事务跨越用户输入
考虑使用乐观锁。乐观锁使用时间戳验证数据是否还没有被其他用户改变,否则事务失败
使用 恰当的更新,例如:更新行/表中已经存在的数据,而不要添加或者删除行/表。在适当的位置更新数据要比移动数据快得多,如果更新需要的空间比表设计能提供的更多,这可能是需要的。如果你设计的行需要空间初始化,更新将会更快。交易是你的表可能需要更多的磁盘空间,但可能速度更快。由于磁盘空间是便宜的,使用一点点能提高性能,这应该说是非常有价值的投资
分开存储正在操作的数据和历史数据(更一般的情况是将频繁使用的数据和不常使用的数据分开存储)
尽可能小的保留你的操作数据集,避免必须读那些不相关的数据
DBMS可以很好的并行运转,尽量将应用设计成当和 DBMS交互时应用能做其他事情。
使用流水线操作和并行操作。 将应用设计成支持大量并行进程, 使应用运行更快。如果要处理多步,努力设计好应用,以使后来的步骤能够在任何优先的进程已经完成的数据部分上开始工作,而不是必须等到优先进程完成
事物的保护级别越高,性能损失就越大。事物级别按增长的顺序为: TRANSACTION_NONE, TRANSACTION_READ_UNCOMMITTED, TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ, TRANSACTION_SERIALIZABLE。使用Connection.setTransactionIsolation() 设置你想要的事物级别
默认的自动提交模式由于使每一个数据库命令都成为一个单独的事务,这会严重影响性能,关闭自动提交(Connection.setAutoCommit(false) ),明确声明事务
通过整合多个事务为一个的批量操作,并在一个statement中使用Statement.addBatch() 和Statement.executeBatch()
Savepoints (from JDBC3.0)需要昂贵的资源。一旦不再需要,就立刻使用Connection.releaseSavepoint()释放掉Savepoints
ConnectionPoolDataSource (from JDBC3.0)和PooledConnection接口为连接池提供了built-in支持
使用setLogWriter() (from Driver, DataSource, or ConnectionPooledDataSource; from JDBC3.0) 帮助跟踪JDBC流
使用Connection.setReadOnly(true)优化只读数据库(操作)交互
使用Connection.nativeSQL()察看SQL查询如何在数据库种执行,帮助确保SQL已被优化
切记:一旦可能,立刻关闭Statement和ResultSet
使用DatabaseMetaData获得数据库功能性信息
一直捕捉和处理数据库警告和异常
使用最恰当的数据类型明确数据的类型,例如:以date类型存储日期,儿不要用varchar
使用可滚动ResultSet (JDBC 2.0)
综述:Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。 More …
在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 SELECT SUM(population) FROM bbc
这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有国家的总人口数。
通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值。
HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前.
而 HAVING子句在聚合后对组记录进行筛选。
让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句。
SQL实例:
一、显示每个地区的总人口数和总面积: SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。
二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。 SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
相反,HAVING子句可以让我们筛选成组后的各组数据
group by
分组
通用数据库具有基于表的特定列对数据进行分析的能力。
可按照在 GROUP BY 子句中定义的组对行进行分组。以其最简单的形式,组由称为分组列的列组成。 SELECT 子句中的列名必须为分组列或列函数。列函数对于 GROUP BY 子句定义的每个组各返回一个结果。下列示例产生一个列出每个部门编号的最高薪水的结果:
SELECT DEPT, MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT
此语句产生下列结果:
DEPT MAXIMUM
—— ———
10 22959.20
15 20659.80
20 18357.50
38 18006.00
42 18352.80
51 21150.00
66 21000.00
84 19818.00
注意:计算的是每个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY)。
将 WHERE 子句与 GROUP BY 子句一起使用
分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句。例如:
SELECT WORKDEPT, EDLEVEL, MAX(SALARY) AS MAXIMUM
FROM EMPLOYEE
WHERE HIREDATE > ‘1979-01-01’
GROUP BY WORKDEPT, EDLEVEL
ORDER BY WORKDEPT, EDLEVEL
结果为:
WORKDEPT EDLEVEL MAXIMUM
——– ——- ———–
D11 17 18270.00
D21 15 27380.00
D21 16 36170.00
D21 17 28760.00
E11 12 15340.00
E21 14 26150.00
注意:在 SELECT 语句中指定的每个列名也在 GROUP BY 子句中提到。未在这两个地方提到的列名将产生错误。GROUP BY 子句对 WORKDEPT 和 EDLEVEL 的每个唯一组合各返回一行。
在 GROUP BY 子句之后使用 HAVING 子句
可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。为此,在GROUP BY 子句后面包含一个 HAVING 子句。 HAVING 子句可包含一个或多个用 AND 和 OR 连接的谓词。每个谓词将组特性(如 AVG(SALARY))与下列之一进行比较:
该组的另一个特性
例如:
HAVING AVG(SALARY) > 2 * MIN(SALARY)
常数
例如:
HAVING AVG(SALARY) > 20000
例如,下列查询寻找雇员数超过 4 的部门的最高和最低薪水:
SELECT WORKDEPT, MAX(SALARY) AS MAXIMUM, MIN(SALARY) AS MINIMUM
FROM EMPLOYEE
GROUP BY WORKDEPT
HAVING COUNT(*) > 4
ORDER BY WORKDEPT
此语句产生下列结果:
WORKDEPT MAXIMUM MINIMUM
——– ———– ———–
D11 32250.00 18270.00
D21 36170.00 17250.00
E11 29750.00 15340.00
有可能(虽然很少见)查询有 HAVING 子句但没有 GROUP BY 子句。在此情况下,DB2 将整个表看作一个组。因为该表被看作是单个组,所以最多可以有一个结果行。如果 HAVING 条件对整个表为真,则返回选择的结果(该结果必须整个由列函数组成);否则不返回任何行。
创建一个日期对象
使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子。 这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间。
import java.util.Date;
public class DateExample1 {
public static void main(String[] args) {
// Get the system date/time
Date date = new Date();
System.out.println(date.getTime());
}
}
今天是星期一,2005年8月8日,上午8:43,上面的例子在系统输出设备上显示的结果是1123461832312。
日期数据的定制格式
使用类java.text.SimpleDateFormat和它的抽象基类 java.text.DateFormat 完成日期数据的格式定制,比方今天星期一-八月-08-2005。下面的例子展示了如何完成这个工作:
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateExample2 {
public static void main(String[] args) {
SimpleDateFormat bartDateFormat = new SimpleDateFormat(“EEEE-MMMM-dd-yyyy”);
Date date = new Date();
System.out.println(bartDateFormat.format(date));
}
}
只要通过向SimpleDateFormat 的构造函数传递格式字符串”EEE-MMMM-dd-yyyy”,就能够指明自己想要的格式。运行结果就是:星期一-八月-08-2005 了。传递”EE-MM-dd-yy”会显示 星期一-08-08-05 。
将文本数据解析成日期对象
假设一个文本字符串包含了一个格式化了的日期对象,而需要解析这个字符串并从文本日期数据创建一个日期对象。下面的例子,将解析文本字符串”8-8-2005″并创建一个值为1123430400000 的日期对象。
例子程序:
import java.text.SimpleDateFormat; import java.util.Date;
public class DateExample3{ public static void main(String[] args) { // Create a date formatter that can parse dates of the form MM-dd-yyyy. SimpleDateFormat bartDateFormat = new SimpleDateFormat(“MM-dd-yyyy”); // Create a string containing a text date to be parsed. String dateStringToParse = “8-8-2005”; try { // Parse the text version of the date. //We have to perform the parse method in a //try-catch construct in case dateStringToParse //does not contain a date in the format we are expecting. Date date = bartDateFormat.parse(dateStringToParse); // Now send the parsed date as a long value // to the system output. System.out.println(date.getTime()); } catch (Exception ex){ System.out.println(ex.getMessage()); } } }
使用标准的日期格式化过程
可以生成和解析定制的日期格式后,现在来看一看如何使用内建的格式化过程。使用方法DateFormat.getDateTimeInstance()可以得到用几种不同的方法获得标准的日期格式化过程。在下面的例子中,我们获取了四个内建的日期格式化过程。它们包括一个短的,中等的,长的,和完整的日期格式。
import java.text.DateFormat; import java.util.Date;
public class DateExample4{ public static void main(String[] args) { Date date = new Date(); DateFormat shortDateFormat = DateFormat.getDateTimeInstance (DateFormat.SHORT,DateFormat.SHORT); DateFormat mediumDateFormat = DateFormat.getDateTimeInstance (DateFormat.MEDIUM,DateFormat.MEDIUM); DateFormat longDateFormat = DateFormat.getDateTimeInstance (DateFormat.LONG,DateFormat.LONG); DateFormat fullDateFormat = DateFormat.getDateTimeInstance DateFormat.FULL,DateFormat.FULL);
System.out.println(shortDateFormat.format(date)); System.out.println(mediumDateFormat.format(date)); System.out.println(longDateFormat.format(date)); System.out.println(fullDateFormat.format(date)); } }
注意我们在对 getDateTimeInstance的每次调用中都传递了两个值。 第一个参数是日期风格, 而第二个参数是时间风格。 它们都是基本数据类型int(整型)。考虑到可读性,这里使用了DateFormat 类提供的常量: SHORT, MEDIUM, LONG, 和 FULL。
运行例子程序, 它将向标准输出设备输出下面的内容:
05-8-8 上午9:17 2005-8-8 9:17:42 2005年8月8日 上午09时17分42秒2005年8月8日 09时17分42秒 GMT+08:00
(完成 程序测试结果基于JDK1.2.2)
阅读全文(76) | 回复(2) | 引用(0)
回复:java Date 显示格式
[ chenglong发表评论于2005-8-10 2:51:06 ]
第一个要求很简单的,就是先定制一个年月日字符型格式的日期,然后将它解析成一个日期对象;再设置一个只显示星期几的日期的格式,将上面的日期对象格式输出就行了。
第二个要求也不难,你是想对数据库中的数据操作,我这里就用数组给你模拟一下吧。我定义了两个int变量SHANGBAN,XIUXI,对应你的两个字段值1和0,然后我对8月的数据进行了操作(我是假设双休日休息,对应今年的这个月),根据输入的年月日字符,用substing提取了各个字段,然后进行相应查找就行了。你可以用各个字段到数据库中相应的那一天查询对应的值就ok了。
下面是我的程序:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.lang.String;
import java.lang.Integer;
public class DateExample{
public static void main(String[] args){
int SHANGBAN = 1; //上班
int XIUXI = 0; //休息
int[] AugDay = { //八月份数据
SHANGBAN,SHANGBAN,SHANGBAN,SHANGBAN,SHANGBAN,XIUXI,XIUXI,
SHANGBAN,SHANGBAN,SHANGBAN,SHANGBAN,SHANGBAN,XIUXI,XIUXI,
SHANGBAN,SHANGBAN,SHANGBAN,SHANGBAN,SHANGBAN,XIUXI,XIUXI,
SHANGBAN,SHANGBAN,SHANGBAN,SHANGBAN,SHANGBAN,XIUXI,XIUXI,
SHANGBAN,SHANGBAN,SHANGBAN
};
// Create a date formatter that can parse dates of the form yyyy-MM-dd.
SimpleDateFormat bartDateFormat1 = new SimpleDateFormat(“yyyy-MM-dd”);
// Create a string containing a text date to be parsed.
String dateStringToParse = “2005-8-10”; //可以改成接受输入
try {
Date date = bartDateFormat1.parse(dateStringToParse);
SimpleDateFormat bartDateFormat2 = new SimpleDateFormat(“EEEE”);
System.out.println(dateStringToParse + ” ” +bartDateFormat2.format(date));
int year = Integer.parseInt(dateStringToParse.substring(0,4));
int month = Integer.parseInt(dateStringToParse.substring(5,6));
int day = Integer.parseInt(dateStringToParse.substring(7,9));
if(month == 8){
//假如输入的是8月份的话(这里只是演示,指的是今年8月,你可以按你的需要修改)
if(AugDay[day-1] == SHANGBAN){
System.out.println(“今天上班”);
}
else{
System.out.println(“今天休息”);
}
}
}
catch (Exception ex){
System.out.println(ex.getMessage());
}
}
}
输入时间是2005-8-10,只用了八月的数组里的值来显示大体的意思,你完全可以修改满足你的需要。最后显示结果为:
2005-8-10 星期三
今天上班
好了,应该很清楚了吧,加油,也感谢你的支持!
I LOVE JAVA!
posted on 2005-09-15 11:38 sharky的点滴积累 阅读(699) 评论(0) 编辑 收藏
表 tree
字段 master
sub
sales
insert into tree values
(‘主1’, ‘主2’, 15);
insert into tree values
(‘主1’, ‘主3’, 20);
insert into tree values
(‘主2’, ‘主4’, 5);
insert into tree values
(‘主2’, ‘主5’, 10);
insert into tree values
(‘主3’, ‘主5’, 30);
insert into tree values
(‘主3’, ‘主6’, 40);
SQL> select * from tree;
MASTER SUB SALES
———- ———- ———-
主1 主2 15
主1 主3 20
主2 主4 5
主2 主5 10
主3 主5 30
主3 主6 40
如果用树型结构表示如下:
’主1’
-‘主2’
–‘主4’
–‘主5’
’主1’
-‘主3’
–‘主5’
–‘主6′
SQL> select * from tree
start with sub=’主2’ –相当于普通sql的where条件
connect by prior master=sub; –遍历的顺序是sub先于master遍历,也就是说从sub往上遍历一直到master(根节点)
2
MASTER SUB SALES
———- ———- ———-
主1 主2 15
SQL> select * from tree
start with master=’主2′
connect by prior master=sub; –sub往上遍历至根节点(参考一下树型图)
2 3
MASTER SUB SALES
———- ———- ———-
主2 主4 5 –这条是自己本身,也就是第一遍遍历
主1 主2 15 –这是第2次遍历,我们从树型图可以看到,’主2’往上遍历是’主1’
主2 主5 10
主1 主2 15
好,我们关看上面可能还是不好理解,我们加入一个树结构专用函数sys_connect_by_path,便于理解
SQL> select sys_connect_by_path(MASTER,’/’) from tree –master表示我遍历的起点只找在master列中存在的,如下例只要’主2’为起点,并以/为分割符
start with master=’主2′
connect by prior master=sub; –往根节点遍历
2 3
SYS_CONNECT_BY_PATH(MASTER,’/’)
——————————————————————————–
/主2 –第1遍遍历
/主2/主1 –第2遍遍历
/主2 –第2条master=’主2’的记录的第1次遍历
/主2/主1 –第2条master=’主2’的记录的第2次遍历
SQL> select sys_connect_by_path(MASTER,’/’) from tree –起点为sub=’主5’时MASTER=主2,主3
start with sub=’主5′
connect by prior master=sub;
2 3
SYS_CONNECT_BY_PATH(MASTER,’/’)
——————————————————————————–
/主2
/主2/主1
/主3
/主3/主1
SQL> select sys_connect_by_path(MASTER,’/’),sub,master from tree
start with sub is not null
connect by prior master=sub;
2 3
SYS_CONNECT_BY_PATH(MASTER,’/’ SUB MASTER
—————————— ———- ———-
/主1 主2 主1 –找主1到根的路径,这里根是主1他自己
/主1 主3 主1
/主2 主4 主2
/主2/主1 主2 主1 –找主2到根的路径,这里根是主1
/主2 主5 主2
/主2/主1 主2 主1
/主3 主5 主3
/主3/主1 主3 主1
/主3 主6 主3
/主3/主1 主3 主1
select sys_connect_by_path(MASTER,’/’),sub,master from tree
start with sub is not null
connect by prior sub = master;
SYS_CONNECT_BY_PATH(MASTER,’/’ SUB MASTER
—————————— ———- ———-
/主1 主2 主1
/主1/主2 主4 主2
/主1/主2 主5 主2
/主1 主3 主1
/主1/主3 主5 主3
/主1/主3 主6 主3
/主2 主4 主2
/主2 主5 主2
/主3 主5 主3
/主3 主6 主3
________________________________________
Go to source web page: Oracle–树的使用(Connect By) – 开发者在线 – www.builder.com.cn
UML语言的概述:
1:UML统一建模语言( Unified Modeling Language ),用于商业建模,软件开发建模,及各类系统的建模。建模很符合人类思维的方式,先把具体的东西抽象化,再把抽象的东西转化为另一类具体的东西。 More …
9:JAVA解析XML的方式?
答:SAX、DOM
11:用JAVA实现一种排序 ,比较,JAVA类实现序列化的方法(二种)?
如在COLLECTION框架中,实现比较要实现什么样的接口。
14.设计模式与UML方面。
如工厂模式,解决多数据库支持问题。
15。 编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
16。在ORACLE大数据量下的分页解决方法。 一般用截取ID方法,还有是三层嵌套方法。
17。WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI解释。
18。BS与CS的联系与区别。
20。JAVA多线程编程。
用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。
21。JAVA的基本功: STRING与STRINGBUFFER的区别。
22。STRUTS的应用(如STRUTS架构)
2. 字符串的操作:
写一个方法,实现字符串的反转,如:输入abc,输出cba
public static String reverse(String s){
int length=s.length();
StringBuffer result=new StringBuffer(length);
for(int i=length-1;i>=0;i–)
result.append(s.charAt(i));
return result.toString();
}
写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出bbbhhtccc。
3. 数据类型之间的转换
如何将数值型字符转换为数字(Integer,Double)
如何将数字转换为字符
如何去小数点前两位,并四舍五入。
4. 日期和时间
如何取得年月日,小时分秒
Date dat=new Date();
dat.getYear();dat.getMonth();dat.getDay();dat.getHours();…
如何取得从1970年到现在的毫秒数
long now=dat.getTime();
如何获取某个日期是当月的最后一天
如何格式化日期
DateFormate df=DateFormate.getInstance();
df.Format(dat);
5. 数组和集合
6. 文件和目录(I/O)操作
如何列出某个目录下的所有文件
如何列出某个目录下的所有子目录
判断一个文件或目录是否存在
如何读写文件
7. Java多态的实现(继承、重载、覆盖)
8. 编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。
9. Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。
10. 找出下列代码可能存在的错误,并说明原因:
三、J2EE相关知识
1. 介绍J2EE、J2SE、J2SE的区别。
2. J2EE是一种技术还是一种平台,他提供了那些技术。
3. 什么是Application Server,它有什么功能和优点。
4. 简单介绍连接池的优点和原理。
5. Web.xml的作用
四、其他
1. Web安全性的考虑(表单验证、浏览器Basic方式的验证,应用程序的安全性,SSL,代码考虑)
2. 简单介绍您所了解的MVC。
3. 简单介绍所了解的XML。
4. 文档和编码规范
5. Java中的分页、效率考虑。
6. 简单介绍您所了解的structs。
找出以下程序错误。
Class Test{
private String par1;
private String par2;
Test(){
}
public static void main(String[] arg){
int a ;
if(a){
System.out.println(“par1=”+par1);
}else{
System.out.println(“par2=” + par2);
}
}
}
Servlet的生命周期问题参见:
1:良葛格學習筆記 http://caterpillar.onlyfun.net/Gossip/JSPServlet/ServletLifeTime.htm
2: Sun的官方教程 http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/jst.14/14.1.htm
简述HttpSession的作用、使用方法,可以用代码说明。(时间3分钟)
请画出Servlet 2.2以上Web Application的基本目录结构(时间2分钟)
谈谈你对三层结构的理解(时间5分钟)
五、名词解释写出全称并简要说明(12分钟)
a)EJB
b)JNDI
c)MVC
d)UML
e)LDAP
f)SOAP
六、程序设计,写出一个Servlet,实现以下功能:已知数据源的JNDI地址为jdbc/db2DataSource,请用这个名字获得数据库连接,
执行SQL:”SELECT A,B FROM MYTALBE”,把执行结果输出到文本文件”out.txt”中,并将请求转发到”/application/test.jsp”。(6分钟)
1.Applet与servlet如何通信;
Applet应该是一种不常用的技术了,所以Applet与servlet的通信我不太清楚,但客户端与servlet的通信基于以下模型:
客户端请求–〉web容器--〉servlet容器--〉servlet
2.JSP标签的作用?如何定义
(1)定义标签类
(2)配置标签类
(3)声明引用
(4)使用标签
3.如何解决界面友好和操作简便:
你要问人机界面的设计?这是一个比较的论题,我谈一下我自己的认识。我感觉有以下几点可以参考:
(1)界面设计要一致,windows系统之所以这么流行,跟它一直得用户界面不无关系,它有着一致的菜单栏、一致的工具栏,
用户使用任何windows下的应用程序都会很快上手,至少不会因为界面问题而卡住,这一点很值得学习。
(2)界面必须使用户随时掌握任务的进展情况
(3)界面必须能够提供帮助
(4)宁可让程序多干,不可让用户多干
(5)具有较强的容错功能
4.有一个3*4的table如何在一个表格中按回车键跳到下一个表格中;
5.EJB的事物是如何实现的?何时进行回滚;
6.根据你的开发经验,说说你是如何对你的系统进行J2EE设计模式的。何谓J2EE设计模式,如何应用?
7.用JAVA实现一个数据连结池。
达内学员提供的面试题
冯健诚:达内SD0407毕业学员
目前就职于:中国银行下属的软件部门做软件开发工作。
冯健诚:首先先谢谢达内的老师在前面的五个月里给我的帮助,使得我能顺利的找到工作.
下面是我遇到的一些面试的题目,希望对学第,学妹能有帮助.
3,替换一个index.html文件中的”<”替换成”<",">"替换成">“,并还保存成原文件名
4,写程序算出3的300次方除以7余几。(程序写不出来的话,可以谈谈算法)
还有其他一部分题目,说几点自己感觉要注意的好了
1,char ch = …;
然后在if的时候写成了 if(ch > “A”) //这个里的”A”应该用单引号
java:
1,写一个函数打印出1-100之间所有的素数
2,说说struts是怎么体现mvc的
3,谈谈一些你了解的设计模式
祝工作顺利^^!
在此感谢冯健诚学员还惦记这达内在校的学第学妹们,同时也恭喜他找到了自己满意的工作。
1、表user有字段(ID, 姓名, 部门编号),ID是主键; 表department有字段(部门编号, 部门名称),部门编号是主键。表user 与表department是N-1的关系,也就是说一个user一定属于唯一的一个部门,一个部门可以有多个人员。
a.请写出一个SQL语句,查询出user表中所有人员的(ID,姓名,部门名称)。
b.如果希望一次性插入一个user(‘001’, ‘tom’,’101’)记录,和他所属的department(‘101’, ‘Develop Dept.’),要么全失败,要么全成功,应该怎么做呢?(只需要写出示意性的语句就可以了)
a:
SELECT u.id , u.name , d.name FROM user AS u , department AS d WHERE u. departmentid = d.id;
b:
SET AUTOCOMMIT = 0;
BEGIN;
INSERT INTO user VALUES(‘001’, ‘tom’, ‘101’);
INSERT INTO department VALUES(‘101’, ‘Develop Dept’);
COMMIT;
失败的话:
ROLLBACK;
2、请简单解释一下DTD在XML语言中的主要作用,以及SOAP协议的用途。
DTD是Document type Definition(文档类型定义)的缩写,它规定了XML文档的构建方式。
SOAP的全称是Simple Object Access Protocol,即简单对象访问协议。SOAP是在分散或分布的环境中交换信息的简单协议,他以XML作为数据传送的方式。SOAP对于实现基于Web的无缝集成系统发挥着非常重要的作用。SOAP有助于实现松散耦合的、跨平台的、于语言无关的、与特定接口无关的分布式系统。
3、尽管SQL92标准已经被公认为标准的SQL语言规范,但是通常不同数据库服务器所能够接受的SQL语句都会有一些区别。假如一套软件需要支持多种不同的数据库,而源代码中的SQL语句只希望有一套,从学过的课程,你会联想到什么解决方法呢?(简单叙述一下思路)
对于大部分的应用系统来说,SQL92标准已经够用了,很多时候我们只是使用这些数据库之间功能的公共子集。对于复杂的应用系统可以采用类似Hibernate的做法,提供一套自定义的SQL文法,然后将其转换为不同数据库特定的SQL。这样在业务逻辑层上只有一套多数据库共用的’SQL’语句。或者直接采用Hibernate,使用其所提供的HQL,这样多数据库可以共用一套HQL语句。
4、假如有集合A、B,A与B之间为一一影射关系,并且这一影射是无固定规律的。现在需要在程序中每当给定A中的一个元素时,迅速的找到B中对应的一个元素。你认为选择什么样的数据结构比较合适呢?(不需要写程序)
Map
5、在一个汽车模拟游戏中,各种不同汽车由于性能参数不同,在同一个跑道上奔跑时姿态的算法各不相同。当你用C++语言设计这个程序时,会想到利用C++的什么特性呢?
函数重载。
以下编程题目如无特殊要求,可以使用JAVA、C、C++、C#、PASCAL语言。
6、写出一个函数,将人民币的小写数字,转换成大写。
如:2084.52 —》贰仟零八十四圆五角贰分
要求考虑全面,算法精练,书写规范。
public static String moneyConvert(double input) {
String[] faceVal = new String[] { “零”, “壹”, “贰”, “叁”, “肆”, “伍”, “陆”, “柒”, “捌”, “玖” };
String[] level = new String[] { “圆”, “拾”, “佰”, “仟”, “萬”, “亿” };
String[] parts = String.valueOf(input).split(“\\.”);
String faceInt = new StringBuffer(parts[0]).reverse().toString();
StringBuffer tempSb = new StringBuffer();
for (int i = 0; i < faceInt.length(); i++) {
tempSb.append(faceVal[Integer.valueOf(faceInt.substring(i, i + 1)).intValue()]);
}
faceInt = tempSb.toString();
String faceDecimal = parts[1];
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < faceInt.length(); i++) {
if (i == 0) {
resultSb.append(level[0]);
} else {
if ((i + 4) % 8 == 0) {
resultSb.append(level[4]);
} else if (i % 8 == 0) {
resultSb.append(level[5]);
} else {
resultSb.append(level[i % 4]);
}
}
String temp = faceInt.substring(i, i + 1);
resultSb.append(temp);
}
String result = resultSb.reverse().toString();
if(faceDecimal.equals("00")){
return result+"整";
}else{
return result+
faceVal[Integer.parseInt(faceDecimal.substring(0,1))]+"角"+
faceVal[Integer.parseInt(faceDecimal.substring(1,2))]+"分";
}
}
7. 写出一个函数将给定的一个数字串补足成10位长度,如:
567 —》 0000000567
23456 —》 0000023456
要求写出一个耗费CPU时间片较少的算法和一个耗费内存资源较少的算法。
/**
* 耗费时间片较少
*/
public static String fillString(long input){
String inputStr = String.valueOf(input);
if(inputStr.length() > 10){
return “”;
}
if(inputStr.length() == 10){
return String.valueOf(input);
}
char[] retValue = new char[10];
for(int i = 0; i < 10; i++){
retValue[i] = '0';
}
int temp = inputStr.length() - 1;
for(int i = 9; i >= 10 – inputStr.length(); i– ){
retValue[i] = inputStr.charAt(temp–);
}
return new String(retValue);
}
/**
* 耗费内存较少
*/
public static String fillString2(long input){
if(input > 9999999999L){
return “”;
}
if(input >= 1000000000L && input <= 9999999999L){
return String.valueOf(input);
}
long tempValue = 1000000000L + input;
StringBuilder retValue = new StringBuilder(String.valueOf(tempValue));
retValue.replace(0,1,"0");
return retValue.toString();
}
面向对象的编程(OOP)能使现实世界中的概念在计算机程序中变成模块。它包括构造程序的特征以及组织数据和算法的机制。OOP语言有三个特征:封装、多态性及继承。所有这些特征与类的概念是息息相关的。 More …