乐趣区

关于java:Java中针对Timestamp的操作解析

Java 中针对 Timestamp 的数据类型操作
数据库应用 Oracle 10g 32 位,存在一张表 STU(学生表)。
这里写图片形容

二、我的项目结构图
这里写图片形容

三、要害代码
Stu (bean)

package sample.bean;

import java.sql.Timestamp;

public class Stu {

private int stuNo;
private String stuName;
private Timestamp createTime;

public int getStuNo() {return stuNo;}
public void setStuNo(int stuNo) {this.stuNo = stuNo;}
public String getStuName() {return stuName;}
public void setStuName(String stuName) {this.stuName = stuName;}
public Timestamp getCreateTime() {return createTime;}
public void setCreateTime(Timestamp createTime) {this.createTime = createTime;}

}

StuDao

public class StuDao {

/**
 * 插入 stu 表记录(PreparedStatement), 效率更高, 更平安
 */
 public void testInsertStuPs(Stu stu) {Connection conn = DBUtil.getConnection(); // 创立数据库连贯
    PreparedStatement ps = null;// 创立 PreparedStatement 对象
    try {System.out.println("========= 连贯胜利 ===============");
        String sql = "insert into stu values(?,?,?)";
        ps = conn.prepareStatement(sql); // 获取 PreparedStatement 对象
        ps.setInt(1, stu.getStuNo());
        ps.setString(2, stu.getStuName());
        ps.setTimestamp(3, stu.getCreateTime());

        int rs = ps.executeUpdate();// 执行更新语句
        if (rs != 0) {System.out.println("insert success");
        } else {System.out.println("insert fail");
        }

    } catch (SQLException e) {e.printStackTrace();
    } finally {DBUtil.closePreparedStatement(ps);
        DBUtil.closeConnection(conn);
    }
}

 /**
 * 查问 stu 表记录
 */
public Stu testSelectStuByNo(int stuNo) {Connection conn = DBUtil.getConnection(); // 创立数据库连贯
    PreparedStatement statement = null;// 创立 statement 对象
    ResultSet result = null;// 创立后果集 ResultSet
    Stu stu = new Stu();
    try {
        String sql = "select * from stu where stuno=?";
        statement = conn.prepareStatement(sql); // 获取 PreparedStatement 对象
        statement.setInt(1, stuNo);
        result = statement.executeQuery();
        if (result.next()) {stu.setStuNo(result.getInt(1));
            stu.setStuName(result.getString(2));
            stu.setCreateTime(result.getTimestamp(3));
        }

    } catch (SQLException e) {e.printStackTrace();
    } finally {DBUtil.closeResultSet(result);
        DBUtil.closePreparedStatement(statement);
        DBUtil.closeConnection(conn);

new Date().getTime();
最近做监控零碎,发现代码中有前两种办法,而后忽然有了一个想法,到底哪个更快呢?

而后做了如下试验:

Java 代码 珍藏代码 XM 返佣 https://www.kaifx.cn/broker/x…
import java.util.Calendar;
import java.util.Date;

public class TimeTest {

private static long _TEN_THOUSAND=10000;  
public static void main(String[] args) {  
    long times=1000*_TEN_THOUSAND;  
    long t1=System.currentTimeMillis();  
    testSystem(times);  
    long t2=System.currentTimeMillis();  
    System.out.println(t2-t1);  
    testCalander(times);  
    long t3=System.currentTimeMillis();  
    System.out.println(t3-t2);  
    testDate(times);  
    long t4=System.currentTimeMillis();  
    System.out.println(t4-t3);  
}  
  
public static void testSystem(long times){//use 188  
    for(int i=0;i<times;i++){long currentTime=System.currentTimeMillis();  
    }  
}  

public static void testCalander(long times){//use 6299  
    for(int i=0;i<times;i++){long currentTime=Calendar.getInstance().getTimeInMillis();}  
}  
  
public static void testDat 该办法的含意是,示意定时器将提早 delay(毫秒)工夫后,执行 task 工作。如果 delay 为正数或 0,则工作会被立刻进行。而且是一次性的执行工作,后续不会反复(或定时)执行该工作。

对于 Timer 类,还提供一个同样性能的办法,如下:

1

public void schedule(TimerTask task, Date time)

该办法与下面办法的区别是,下面办法是指定延期一段时间执行,这个办法是指定在某个具体的工夫点执行。留神,如果零碎的以后工夫曾经超过了参数 time 指定的工夫,该工作会被立刻执行。

当运行下面代码时,咱们发现程序立刻打印相似如下的 2 条信息:

main start:2016-01-13 22:23:18
task run:2016-01-13 22:23:18

因为咱们这里给 schedule 办法传递的 delay 参数值为 0,所以工作会被立刻执行,所以两个语句打印进去的工夫是一样的,这是应该的。大家能够本人扭转传入的 delay 值来看输入信息的变动。再过大概 5 秒(即 sleep 的工夫)后,持续打印了 1 条信息:

main end:2016-01-13 22:23:23

打印信息的工夫与下面语句差了 5 秒,与 sleep 设置的统一,也是很正当的。

但咱们会发现一个很乏味的景象,会发现该过程不会退出,这时 main 主线程曾经完结了,这阐明定时器把工作实现后,即便前面没有待期待执行的工作了,定时器中创立的后盾线程也不会立刻退出。查看了相干的 java doc 文档,解释说定时器线程不会被动退出,须要期待垃圾回收,但 java 的待垃圾回收是无奈通过代码本人管制的,而是由虚拟机管制的。

退出移动版