我正在使用Spring框架中的JdbcTemplate。
数据库是Postgres。
问题是我在java中读取.cer文件,并希望将此证书的内容存储到列类型OID的postgress数据库并使用jdbctemplate但是获取异常是
列" cert_file"是oid类型但表达式是bytea
以下是代码
final String sql1 = "INSERT INTO sp_certificate_detail " +
"(public_key,cert_file)values(?,?)";
status = jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(
Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(
sql1, new String[] { "cert_id" });
ps.setString(1, spreg.getPublicKey());
ps.setBytes(2, spreg.getCertFileContent());//This is byte[] of type
return ps;
}
}, keyHolder);
To get certiticate content am using below code
cfb = CertificateFactory.getInstance("X.509");
X509Certificate certb = (X509Certificate) cfb.generateCertificate(fileInputStream);
spreg.setCertFileContent(certb.getEncoded());
请有人建议解决方案
我尝试将byte []转换为LOB,然后获得不同的异常
大对象可能无法在自动提交模式下使用。嵌套异常是org.postgresql.util.PSQLException:大对象可能无法使用 d在自动提交模式下。
代码低于
ps.setBlob(10, (new SerialBlob(spreg.getCertFileContent())));
答案 0 :(得分:0)
我已将列类型更改为bytea
现在正在使用
答案 1 :(得分:0)
将下面的代码集成到您的代码中,应该可以正常工作。
import org.postgresql.largeobject.LargeObject;
import org.postgresql.largeobject.LargeObjectManager;
(postgresql jdbc jar中提供的包)
LargeObjectManager largeObjectManager = null;
LargeObject largeObject = null;
Long largeObjectRef = null;
largeObjectManager = ((org.postgresql.PGConnection) connection).getLargeObjectAPI();
largeObjectRef = largeObjectManager.createLO(LargeObjectManager.READ | LargeObjectManager.WRITE);
largeObject = largeObjectManager.open(largeObjectRef, LargeObjectManager.WRITE);
largeObject.write("string/file content to write into oid column".getBytes());
largeObject.close();
包含您需要设置的其余代码/参数,以及下面的
ps.setLong(2, largeObjectRef);
ps.executeUpdate();