Tenho que tomar uma decisão de design e estou procurando alguns conselhos sobre as melhores práticas. Eu tenho um programa java que precisa armazenar um grande número (algumas centenas por dia) de matrizes de ponto flutuante em um banco de dados MySQL. Os dados são uma Double
matriz de comprimento fixo de 300. Posso ver três opções razoáveis:
Devo também mencionar que esses dados serão lidos e atualizados com freqüência.
Eu quero usar um BLOB, pois é o que eu fiz no passado e parece ser o método mais eficiente (por exemplo, mantém a largura fixa e não há necessidade de converter para uma string separada por vírgulas). No entanto, meu colega de trabalho está insistindo que devemos serializar e usar varchar por razões que parecem principalmente dogmáticas.
Se um desses métodos for melhor que o outro, os motivos do Java ou do MySQL são específicos?
Armazene como um BLOB da mesma forma (veja o exemplo de código abaixo). Acho que isso é provavelmente melhor do que usar a serialização de java, já que a serialização interna de java precisará de 2427 bytes e os aplicativos não-java terão mais dificuldade em lidar com os dados. Ou seja, se algum dia houver algum aplicativo não Java consultando o banco de dados no futuro ... se não, a serialização embutida terá menos linhas.
public static void storeInDB() throws IOException, SQLException {
double[] dubs = new double[300];
ByteArrayOutputStream bout = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(bout);
for (double d : dubs) {
dout.writeDouble(d);
}
dout.close();
byte[] asBytes = bout.toByteArray();
PreparedStatement stmt = null; // however we normally get this...
stmt.setBytes(1, asBytes);
}
public static double[] readFromDB() throws IOException, SQLException {
ResultSet rs = null; // however we normally get this...
while (rs.next()) {
double[] dubs = new double[300];
byte[] asBytes = rs.getBytes("myDoubles");
ByteArrayInputStream bin = new ByteArrayInputStream(asBytes);
DataInputStream din = new DataInputStream(bin);
for (int i = 0; i < dubs.length; i++) {
dubs[i] = din.readDouble();
}
return dubs;
}
}
Editar: eu esperava usar BINARY (2400), mas o MySQL diz:
mysql> create table t (a binary(2400)) ;
ERROR 1074 (42000): Column length too big for column 'a' (max = 255);
use BLOB or TEXT instead
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras