在翻阅《JDK6学习笔记》时,看到static关键字用法,虽然很早就知道大概,但自己没有动手试过,遂决定试试到底static关键字能否带来好处。举个例子,一般情况下,可能在连接数据库时,首先会在自己的类中做一些初始化动作,那么我们假设利用static block来初始数据库的连接与一般数据库连接有什么不同呢,写了如下粗略测试代码:
package cn.xbmu.lib.jfly.test;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* 测试Static Block用法,在Static Block中初始化一个数据库连接
* @author JFly
*/
public class TestStaticBlock {
private static Connection conn = null;
static String CLASSFORNAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
static String CONN_STR = "jdbc:sqlserver://localhost:1433;databaseName=oblog";
static String DB_USER = "sa";
static String DB_PWD = "";
private static ResultSet rs = null;
static {
try {
Class.forName(CLASSFORNAME);
conn = DriverManager.getConnection(CONN_STR, DB_USER, DB_PWD);
System.out.println("数据库连接已建立!");
} catch (SQLException ex) {
Logger.getLogger(TestStaticBlock.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(TestStaticBlock.class.getName()).log(Level.SEVERE, null, ex);
}
}
public String getRecord(Connection aConn, int id) {
try {
rs = aConn.prepareStatement("select * from oblog_user where userid = " + "'" + id + "'").executeQuery();
if (rs.next()) {
System.out.println("rs=" + rs);
System.out.println("username=" + rs.getString("username"));
return rs.getString("username");
}
} catch (SQLException ex) {
Logger.getLogger(TestStaticBlock.class.getName()).log(Level.SEVERE, null, ex);
}
return "没有记录";
}
public static Connection getConn() throws SQLException {
if (conn != null) {
return conn;
}
return DriverManager.getConnection(CONN_STR, DB_USER, DB_PWD);
}
public static void closeConn() throws SQLException {
if(rs != null) {
rs.close();
}
if(conn != null) {
conn.close();
}
}
public static void main(String[] args) throws SQLException {
long beginTime = System.currentTimeMillis();
TestStaticBlock tsb = new TestStaticBlock();
//TestStaticBlock.conn = null;
System.out.println("conn1 = " + TestStaticBlock.conn);
System.out.println("conn2 = " + TestStaticBlock.getConn());
System.out.println("username = " + tsb.getRecord(getConn(), 3));
long endTime = System.currentTimeMillis();
TestStaticBlock tsb_1 = new TestStaticBlock();
System.out.println("conn1 = " + TestStaticBlock.conn);
System.out.println("username = " + tsb_1.getRecord(getConn(), 4));
closeConn();
System.out.println("执行时间:" + (endTime - beginTime));
}
}
输出执行时间大致为63,而如果静态方法呢,代码如下:
package cn.xbmu.lib.jfly.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* 测试static方法
* @author JFly
*/
public class TestStaticMethod {
public static void getUser(int id) {
String CLASSFORNAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String CONN_STR = "jdbc:sqlserver://localhost:1433;databaseName=oblog";
String DB_USER = "sa";
String DB_PWD = "";
Connection conn = null;
long beginTime = System.currentTimeMillis();
try {
Class.forName(CLASSFORNAME);
conn = DriverManager.getConnection(CONN_STR, DB_USER, DB_PWD);
System.out.println("数据库连接已建立!");
ResultSet rs = null;
try {
rs = conn.prepareStatement("select * from oblog_user where userid = " + "'" + 3 + "'").executeQuery();
if (rs.next()) {
System.out.println("username = " + rs.getString("username"));
}
} catch (SQLException ex) {
Logger.getLogger(TestStaticBlock.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (rs != null) {
rs.close();
}
if (conn != null) {
conn.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("执行时间:" + (endTime - beginTime));
}
public static void main(String[] args) {
TestStaticMethod.getUser(3);
}
}
程序执行时间大致为297,可见static block带来的效率要比static method高很多。