2012-03-27 5 views
0

私がSystem.currentTimeMillis()メソッドを使用して作成したjava.sql.Timestampは、MySQLデータベースに1970-01- 01 01:00:00。私が作成していjava.sql.TimeStampとmysqlデータベースを使用して奇妙な動作が発生しました

2つのタイムスタンプは、私が実行しようとしている監視タスクの開始と終了をマークしている、どのような次の行動が

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); 

を発生し、ここでのコードであるコードからexceptsであります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]))); 

タイムスタンプ上のJavaDocs(http://docs.oracle.com/javase/1.5.0/docs/api/java/sql/Timestamp.html)によれば、1970年1月1日以降、ミリ秒で時間がかかり、簡単な印刷テストでこれが確認されています。私が探しています何

は次のとおりです。

  • java.sql.TimestampてMySQLデータベースのタイムスタンプを保存しようとしているこの現象の理由は?
  • この現象に対する解決策はありますか?
  • 可能な代替手段はありますか?
  • 改善がありますか?

EDIT: がSTART_INDEXとEND_INDEXが何であるかを含めるように依頼されて:

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

は、オリジナルのポストにそれらを入れていないために謝罪します。

+0

なぜ値を文字列に変換して戻していますか?なぜ、強く型付けされた方法で各パラメータを取るだけではないのですか? –

+0

私はもともとコードを書いていたときに、メソッドに必要なパラメータの数が不明なので、Stringを使用することにしました...その時私は時間を節約することを誓っています:) – OpelMac

+0

すぐにそれを変更することを強くお勧めします。注文に依存しないように、パラメータには常に別の「ビルダー」を使用できます。現在、START_INDEXなどが何であるかわからないので、問題は*そこにある可能性があります。わかりません。 –

答えて

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

それは正しいでしょうが、それらのparams値は上記のステートメントと直接一致しません。多くの理由から、名前インデックスは最初のパラメータセットではなく、idは(メソッド内で作成された)JDBCは0ではなく1でインデックスを作成するように見えます。パラメータの順序が間違っていると、mysql例外がスローされるため、これらのことを確認します。プラス面がある場合は、強く型付けされたパラメータを変更するように私に確信しています。私のコードは私だけでなく他の人にも読めるようになっていることを忘れてしまった! – OpelMac

+0

@OpelMac:あなたが何を意味するか分かりませんが、あなたが*投稿したコードには私が記述した問題があります。あなたの実際のコードが大きく異なる場合は、どのように私があなたを助けることができるのかわかりません... –

+0

私は誤って私のコメントを終了する前に入力してください。私はそれについてお詫び申し上げます: – OpelMac

関連する問題