Я работаю над проектом, который разрабатывался на более ранней версии Java ниже 1.7 и Oracle 11 в качестве базы данных.
В этом я сталкиваюсь со странной проблемой автоматического округления десятичных значений.Проблема в том, что десятичные значения вычисляются правильно в Java-коде и сохраняются в переменную с двойным типом данных.Кроме того, таблица базы данных, в которую вставляются значения, содержит номер типа данных без какой-либо точности или масштаба.При вставке вычисленных выше значений через подготовленный пакет операторов иногда автоматически округляется, а иногда работает нормально.Это периодически возникающая проблема.
Ниже приведен код метода вставки, в котором происходит вставка с использованием драйвера jdbc,
PreparedStatement ps = ConnectionPool.getStatement(TrafficDAO.class
.getName(), threadId, key);
try {
// if not cached prepare batched statement and cache it
if (ps == null) {
String query = StatementGenerator.getInsertStatement(model,
!directInsert, isDirectLoadingEnabled);
ps = connection.prepareStatement(query);
ConnectionPool.addStatement(TrafficDAO.class.getName(),
threadId, key, ps);
}
ps.clearBatch();
ColumnModel[] columnModels = model.getColumnModels();
HashSet<String> nullCols = new HashSet<String>();;
int nullRowCount = 0;
// add rows to batch
for (int j = startRow; j < endRow; j++) {
Object[] nextRow = rowsToBeInserted.get(j);
boolean nullInRow = false;
for (int i = 0; i < columnModels.length; i++) {
Object value = nextRow[i];
columnModels[i].write(value, i + 1, ps);
}
ps.addBatch();
}
// execute insert
int[] result = null;
String task = opt ? INSERT_OPT_TASK : INSERT_TASK;
try {
Profiler.startTask(task , taskID);
result = ps.executeBatch();
} finally {
Profiler.stopTask(task , taskID);
}
/** write method */
public void write(Object value, int idx, PreparedStatement ps)
throws SQLException
{
if (value == null || (value instanceof Double && ((Double)value).isNaN()))
ps.setNull(idx, Types.DOUBLE);
else
// if we get an empty string for a number this is also null
if(value instanceof String && ((String)value).length() == 0){
ps.setNull(idx, Types.DOUBLE);
}else{
ps.setDouble(idx, convert(value));
}
Не удалось найти причину этой проблемы, пожалуйста, предложите.
Пожалуйста, спросите, если вам нужно больше информации.