Странное поведение при использовании java.sql.TimeStamp и базы данных mysql - PullRequest
0 голосов
/ 27 марта 2012

Странное поведение заключается в том, что java.sql.Timestamp, который я создаю с помощью метода System.currentTimeMillis (), хранится в моей базе данных MySQL как 1970-01-01 01: 00: 00.

Две метки времени, которые я создаю, предназначены для того, чтобы отметить начало и конец задачи мониторинга, которую я пытаюсь выполнить. Ниже приведены исключения из кода, в котором происходит поведение

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

JavaDocs на TimeStamp (http://docs.oracle.com/javase/1.5.0/docs/api/java/sql/Timestamp.html) говорит, что это занимает время в миллисекундах с 1 января 1970 года, и простой тест печати подтверждает это.

Я ищу:

  • Причина такого поведения при попытке сохранить метки времени в базе данных MySQL через java.sql.Timestamp?
  • Какие-нибудь решения для этого поведения?
  • Любые возможные альтернативы?
  • Какие-нибудь возможные улучшения?

EDIT: Было предложено указать, что такое START_INDEX и END_INDEX:

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

Извиняется за то, что не поместил их в исходное сообщение.

1 Ответ

1 голос
/ 27 марта 2012

Хорошо, посмотрите на ваш звонок:

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, в качестве значения для метки времени ... Я подозреваю, что вы не хотите этого делать.

Я бы настоятельно посоветовал вам создать простой тип объекта (возможно, вложенный тип в том же классе), чтобы позволить вам передавать эти параметры в строго типизированном, простом для получения правильного мода.Преобразование строк и доступ по индексу неоправданны и могут легко привести к ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...