2012-03-27 73 views
0

奇怪的行爲是我使用System.currentTimeMillis()方法創建的java.sql.Timestamp存儲在我的MySQL數據庫中,如1970-01- 01 01:00:00。使用java.sql.TimeStamp和mysql數據庫遇到的奇怪行爲

兩個時間戳我創造是標誌着一個監控任務我想執行的開始和結束,中行爲發生

final long startTime = System.currentTimeMillis(); 
while(numberOfTimeStepsPassed < numTimeStep) { 
/* 
* Code in here 
*/ 
} 
final long endTime = System.currentTimeMillis(); 
return mysqlConnection.insertDataInformation(matrixOfRawData, name,Long.toString(startTime), 
               Long.toString(endTime), Integer.toString(numTimeStep), 
               Integer.toString(matrixOfRawData[0].length), owner, 
               type); 

這裏是代碼如下是什麼從代碼節選用於插入時間標記和其他數據到MySQL數據庫

public String insertDataInformation(final double [][] matrix, 
            final String ... params) { 
    getConnection(lookUpName); 
    String id = ""; 
    PreparedStatement dataInformationInsert = null; 
    try { 
     dataInformationInsert = 
       databaseConnection.prepareStatement(DATA_INFORMATION_PREPARED_STATEMENT); 
     id = DatabaseUtils.createUniqueId(); 
     int stepsMonitored = Integer.parseInt(params[STEPS_MONITORED]); 
     int numberOfMarkets = Integer.parseInt(params[NUMBER_OF_MARKETS]); 
     dataInformationInsert.setNString(ID_INDEX, id); 
     dataInformationInsert.setNString(NAME_INDEX, params[0]); 
     dataInformationInsert.setTimestamp(START_INDEX, new Timestamp(Long.parseLong(params[START_INDEX]))); 
     dataInformationInsert.setTimestamp(END_INDEX, new Timestamp(Long.parseLong(params[END_INDEX]))); 
     dataInformationInsert.setInt(STEPS_INDEX, stepsMonitored); 
     dataInformationInsert.setInt(MARKETS_INDEX, numberOfMarkets); 
     dataInformationInsert.setNString(OWNER_INDEX, params[OWNER]); 
     dataInformationInsert.setNString(TYPE_INDEX, params[TYPE]); 
     dataInformationInsert.executeUpdate(); 
     insertRawMatrix(matrix, id, Integer.toString(stepsMonitored), Integer.toString(numberOfMarkets)); 
    } catch (SQLException sqple) { 
     // TODO Auto-generated catch block 
     sqple.printStackTrace(); 
     System.out.println(sqple.getSQLState()); 
    } finally { 
     close(dataInformationInsert); 
     dataInformationInsert = null; 
     close(databaseConnection); 
    } 
    return id; 
} 

代碼的重要的行是:

dataInformationInsert.setTimestamp(START_INDEX, new Timestamp(Long.parseLong(params[START_INDEX]))); 
dataInformationInsert.setTimestamp(END_INDEX, new Timestamp(Long.parseLong(params[END_INDEX]))); 

TimeStamp上的JavaDocs(http://docs.oracle.com/javase/1.5.0/docs/api/java/sql/Timestamp.html)表示,自1970年1月1日以來需要幾毫秒的時間,而簡單的打印測試證實了這一點。

我所尋找的是:

  • 理由,這種行爲試圖通過java.sql.Timestamp存儲在MySQL數據庫中的時間戳是什麼時候?
  • 此行爲的任何解決方案?
  • 任何可能的替代品?
  • 任何可能的改進?

編輯: 被要求包括哪些START_INDEX和END_INDEX是:

private static final int END_INDEX = 4; 
private static final int START_INDEX = 3; 

致歉不把他們在原來的職位。

+0

爲什麼要將值轉換爲字符串並返回?爲什麼不以一種強類型的方式獲取每個參數? – 2012-03-27 15:13:07

+0

當我最初編寫代碼時,我不確定該方法需要多少個參數,所以我決定使用String ...爲了節省我自己的時間:) – OpelMac 2012-03-27 15:21:35

+0

我強烈建議你立即改變它。您始終可以爲參數使用單獨的「構建器」,以便您不依賴於排序。目前我們看不到什麼是START_INDEX等,所以問題*可能會在那裏......我們不知道。 – 2012-03-27 15:22:33

回答

1

好吧,看看您的來電:

insertDataInformation(matrixOfRawData, name, Long.toString(startTime), 
         Long.toString(endTime), Integer.toString(numTimeStep), 
         Integer.toString(matrixOfRawData[0].length), owner, 
         type); 

所以params會有值:

0: name 
1: start time 
2: end time 
3: numTimeStep 
4: matrixOfRowData[0].length 
5: owner 
6: type 

然後你正在做的:

dataInformationInsert.setTimestamp(START_INDEX, 
    new Timestamp(Long.parseLong(params[START_INDEX]))); 

...其中START_INDEX是3.

所以你使用對應於numTimeStep的值作爲時間戳的值...我懷疑你不想這樣做。

我會強烈勸你創建一個簡單的對象類型(可能是嵌套類型在同一個班),讓你在一個強類型的這些參數傳遞,簡單的得到正確時尚。字符串轉換和按索引訪問都是沒有根據的,並且很容易導致錯誤。

+0

這將是正確的,但這些參數值不直接與上述聲明相匹配。由於許多原因,名稱索引不是第一個參數集,id是(在方法內部創建的),並且JDBC似乎在1處開始索引參數而不是在0處。這是奇怪的,我知道。我相信這些是因爲如果我的參數排序錯誤,會拋出一個mysql異常。如果有一個好的一面,你說服我將參數改爲強類型。我忘記了我的代碼必須對其他人可讀,而不僅僅是我! – OpelMac 2012-03-27 15:48:39

+0

@OpelMac:我不知道你的意思,但你發佈的代碼存在我描述的問題。如果您的實際代碼顯着不同,那麼我不確定我的意思是如何幫助您... – 2012-03-27 15:49:46

+0

在完成我的評論之前,我無意中碰到了前面的內容。我爲此道歉:) – OpelMac 2012-03-27 15:51:52