Skip to content

Commit

Permalink
HHH-17789 fix the blob/clob/nclob not free caused hana memory issue
Browse files Browse the repository at this point in the history
  • Loading branch information
JoeyGaoSap authored and beikov committed Mar 5, 2024
1 parent e7dea58 commit 0d67d64
Showing 1 changed file with 79 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1529,25 +1529,33 @@ protected void doBind(CallableStatement st, X value, String name, WrapperOptions
@Override
public <X> ValueExtractor<X> getExtractor(JavaType<X> javaType) {
return new BasicExtractor<>( javaType, this ) {
private X extract(Blob blob, WrapperOptions options) throws SQLException {
if ( blob == null ) {
return null;
}
if ( blob.length() < HANAStreamBlobType.this.maxLobPrefetchSize ) {
X result = javaType.wrap( blob, options );
blob.free();
return result;
}
Blob materializedBlob = new MaterializedBlob( DataHelper.extractBytes( blob.getBinaryStream() ) );
blob.free();
return javaType.wrap( materializedBlob, options );
}

@Override
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
Blob rsBlob = rs.getBlob( paramIndex );
if ( rsBlob == null || rsBlob.length() < HANAStreamBlobType.this.maxLobPrefetchSize ) {
return javaType.wrap( rsBlob, options );
}
Blob blob = new MaterializedBlob( DataHelper.extractBytes( rsBlob.getBinaryStream() ) );
return javaType.wrap( blob, options );
return extract( rs.getBlob( paramIndex ), options );
}

@Override
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
return javaType.wrap( statement.getBlob( index ), options );
return extract( statement.getBlob( index ), options );
}

@Override
protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException {
return javaType.wrap( statement.getBlob( name ), options );
return extract( statement.getBlob( name ), options );
}
};
}
Expand Down Expand Up @@ -1623,6 +1631,20 @@ protected void doBind(CallableStatement st, X value, String name, WrapperOptions
@Override
public <X> ValueExtractor<X> getExtractor(JavaType<X> javaType) {
return new BasicExtractor<>( javaType, this ) {
private X extract(Clob clob, WrapperOptions options) throws SQLException {
if ( clob == null ) {
return null;
}

if ( clob.length() < HANAClobJdbcType.this.maxLobPrefetchSize ) {
X retVal = javaType.wrap(clob, options);
clob.free();
return retVal;
}
NClob materializedNClob = new MaterializedNClob( DataHelper.extractString( clob ) );
clob.free();
return javaType.wrap( materializedNClob, options );
}

@Override
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
Expand All @@ -1633,22 +1655,31 @@ protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) thro
else {
rsClob = rs.getClob( paramIndex );
}

if ( rsClob == null || rsClob.length() < HANAClobJdbcType.this.maxLobPrefetchSize ) {
return javaType.wrap( rsClob, options );
}
Clob clob = new MaterializedNClob( DataHelper.extractString( rsClob ) );
return javaType.wrap( clob, options );
return extract( rsClob, options );
}

@Override
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
return javaType.wrap( statement.getClob( index ), options );
Clob rsClob;
if ( HANAClobJdbcType.this.useUnicodeStringTypes ) {
rsClob = statement.getNClob( index );
}
else {
rsClob = statement.getClob( index );
}
return extract( rsClob, options );
}

@Override
protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException {
return javaType.wrap( statement.getClob( name ), options );
Clob rsClob;
if ( HANAClobJdbcType.this.useUnicodeStringTypes ) {
rsClob = statement.getNClob( name );
}
else {
rsClob = statement.getClob( name );
}
return extract( rsClob, options );
}
};
}
Expand Down Expand Up @@ -1722,25 +1753,32 @@ protected void doBind(CallableStatement st, X value, String name, WrapperOptions
@Override
public <X> ValueExtractor<X> getExtractor(JavaType<X> javaType) {
return new BasicExtractor<>( javaType, this ) {

private X extract(NClob nclob, WrapperOptions options) throws SQLException {
if ( nclob == null ) {
return null;
}
if ( nclob.length() < HANANClobJdbcType.this.maxLobPrefetchSize ) {
X retVal = javaType.wrap(nclob, options);
nclob.free();
return retVal;
}
NClob materializedNClob = new MaterializedNClob( DataHelper.extractString( nclob ) );
nclob.free();
return javaType.wrap( materializedNClob, options );
}
@Override
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
NClob rsNClob = rs.getNClob( paramIndex );
if ( rsNClob == null || rsNClob.length() < HANANClobJdbcType.this.maxLobPrefetchSize ) {
return javaType.wrap( rsNClob, options );
}
NClob nClob = new MaterializedNClob( DataHelper.extractString( rsNClob ) );
return javaType.wrap( nClob, options );
return extract( rs.getNClob( paramIndex ), options );
}

@Override
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
return javaType.wrap( statement.getNClob( index ), options );
return extract( statement.getNClob( index ), options );
}

@Override
protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException {
return javaType.wrap( statement.getNClob( name ), options );
return extract( statement.getNClob( name ), options );
}
};
}
Expand Down Expand Up @@ -1782,25 +1820,32 @@ public String toString() {
@Override
public <X> ValueExtractor<X> getExtractor(final JavaType<X> javaType) {
return new BasicExtractor<>( javaType, this ) {

private X extract(Blob blob, WrapperOptions options) throws SQLException {
if ( blob == null ) {
return null;
}
if (blob.length() < HANABlobType.this.maxLobPrefetchSize ) {
X retVal = javaType.wrap(blob, options);
blob.free();
return retVal;
}
Blob materializedBlob = new MaterializedBlob( DataHelper.extractBytes( blob.getBinaryStream() ) );
blob.free();
return javaType.wrap( materializedBlob, options );
}
@Override
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
Blob rsBlob = rs.getBlob( paramIndex );
if ( rsBlob == null || rsBlob.length() < HANABlobType.this.maxLobPrefetchSize ) {
return javaType.wrap( rsBlob, options );
}
Blob blob = new MaterializedBlob( DataHelper.extractBytes( rsBlob.getBinaryStream() ) );
return javaType.wrap( blob, options );
return extract( rs.getBlob( paramIndex ) , options );
}

@Override
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
return javaType.wrap( statement.getBlob( index ), options );
return extract( statement.getBlob( index ), options );
}

@Override
protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException {
return javaType.wrap( statement.getBlob( name ), options );
return extract( statement.getBlob( name ), options );
}
};
}
Expand Down

0 comments on commit 0d67d64

Please sign in to comment.