Как создать двоичный объект BLOB-объектов в Java определенного размера?
Я пытаюсь создать непрозрачный 64-битный двоичный двоичный объект, закодированный с любым мусором / случайным содержимым, а также пытаюсь сделать его таким образом, чтобы я мог указать размер в килобайтах для сгустка данных, которые будут генерироваться в нем.
Целью этого является измерение производительности записи приложения БД, поддерживающего тип данных BLOB-объектов (например, C*). BLOB-объект не обязательно должен быть уникальным, поэтому его можно создать один раз и просто повторно использовать, чтобы избежать задержки на стороне клиента из-за создания GC и объекта.
Я наивно пытался использовать ByteBuffer.allocateDirect(bSize)
думая, что я мог бы просто использовать любой мусор, который он заберет из памяти, однако я сомневаюсь, что этот подход работает.
Есть предложения, как этого добиться?
4 ответа
Если вы используете Linux, этот маленький трюк из командной строки быстро создает фиктивные файлы:
dd if=/dev/zero of=FileName bs=1024 count=1000
count * bs
= размер файла
Затем:
String sql = "INSERT INTO table (blob) VALUES (?)";
PreparedStatement stmt = conn.prepareStatement(sql);
File blob = new File("path_to_FileName");
FileInputStream fis = new FileInputStream(blob);
stmt.setBinaryStream(1, fis, (int) blob.length());
stmt.execute();
Создайте пользовательскую реализацию InputStream для получения случайных данных:
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
public class RandomInputStream extends InputStream
{
private int available;
private Random random = new Random();
public RandomInputStream(final int totalSize)
{
this.available = totalSize;
}
@Override
public int read() throws IOException
{
if(available == 0)
return -1;
--available;
return random.nextInt(256);
}
@Override
public int available() throws IOException
{
return available;
}
}
А затем просто используйте его как обычно:
InputStream is = new RandomInputStream(1024*1024);
stmt.setBinaryStream(1, is, is.available());
Это было бы самым быстрым возможным решением.
Если вам нужны случайные данные, вы можете использовать Random.nextBytes(byte[]); однако такие системы редко заботятся о содержимом, поэтому вы можете просто использовать все нули.
byte[] blob = new byte[byteCount];
// optionally
// new Random().nextBytes(blob);
stmt.setBinaryStream(1, new ByteArrayInputStream(blob), blob.length);
byte [] blob = new byte [byteCount];
// опционально // new Random (). nextBytes (blob);
stmt.setBinaryStream (1, новый ByteArrayInputStream(blob), blob.length);