Skip to content

Commit

Permalink
Merge pull request #4375 from eclipse/jetty-9.4.x_small_improvment_jdbc
Browse files Browse the repository at this point in the history
avoid non necessary objects allocation if session do not have any attributes data
  • Loading branch information
joakime authored Dec 20, 2019
2 parents cef67d9 + d321c2f commit ccf04a4
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ public class JDBCSessionDataStore extends AbstractSessionDataStore
protected SessionTableSchema _sessionTableSchema;
protected boolean _schemaProvided;

private static final ByteArrayInputStream EMPTY = new ByteArrayInputStream(new byte[0]);

/**
* SessionTableSchema
*/
Expand Down Expand Up @@ -707,17 +709,23 @@ protected void doInsert(String id, SessionData data)
statement.setLong(10, data.getExpiry());
statement.setLong(11, data.getMaxInactiveMs());

try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos))
if(!data.getAllAttributes().isEmpty())
{
SessionData.serializeAttributes(data, oos);
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
statement.setBinaryStream(12, bais, bytes.length);//attribute map as blob
statement.executeUpdate();
if (LOG.isDebugEnabled())
LOG.debug("Inserted session " + data);
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos))
{
SessionData.serializeAttributes( data, oos );
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
statement.setBinaryStream( 12, bais, bytes.length );//attribute map as blob
}
}
else
{
statement.setBinaryStream( 12, EMPTY, 0);
}
statement.executeUpdate();
if ( LOG.isDebugEnabled() ) LOG.debug( "Inserted session " + data );
}
}
}
Expand All @@ -737,20 +745,26 @@ protected void doUpdate(String id, SessionData data)
statement.setLong(5, data.getExpiry());
statement.setLong(6, data.getMaxInactiveMs());

try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos))
if(!data.getAllAttributes().isEmpty())
{
SessionData.serializeAttributes(data, oos);
byte[] bytes = baos.toByteArray();
try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes))
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos))
{
statement.setBinaryStream(7, bais, bytes.length);//attribute map as blob
statement.executeUpdate();

if (LOG.isDebugEnabled())
LOG.debug("Updated session " + data);
SessionData.serializeAttributes(data, oos);
byte[] bytes = baos.toByteArray();
try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes))
{
statement.setBinaryStream( 7, bais, bytes.length );//attribute map as blob
}
}
}
else
{
statement.setBinaryStream( 7, EMPTY, 0);
}
statement.executeUpdate();

if ( LOG.isDebugEnabled() ) LOG.debug( "Updated session " + data );
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ public static void deserializeAttributes(SessionData data, java.io.ObjectInputSt
LOG.info("Legacy serialization detected for {}", data.getId());
//legacy serialization was used, we have just deserialized the
//entire attribute map
data._attributes = new ConcurrentHashMap<String, Object>();
data._attributes = new ConcurrentHashMap<>();
data.putAllAttributes((Map<String, Object>)o);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,17 +173,17 @@ public static boolean checkSessionPersisted(SessionData data)
ResultSet result = null;
try (Connection con = DriverManager.getConnection(DEFAULT_CONNECTION_URL);)
{
statement = con.prepareStatement("select * from " + TABLE +
" where " + ID_COL + " = ? and " + CONTEXT_COL +
" = ? and virtualHost = ?");
statement = con.prepareStatement(
"select * from " + TABLE +
" where " + ID_COL + " = ? and " + CONTEXT_COL +
" = ? and virtualHost = ?" );
statement.setString(1, data.getId());
statement.setString(2, data.getContextPath());
statement.setString(3, data.getVhost());

result = statement.executeQuery();

if (!result.next())
return false;
if (!result.next()) return false;

assertEquals(data.getCreated(), result.getLong(CREATE_COL));
assertEquals(data.getAccessed(), result.getLong(ACCESS_COL));
Expand All @@ -199,16 +199,19 @@ public static boolean checkSessionPersisted(SessionData data)

Blob blob = result.getBlob(MAP_COL);

SessionData tmp = new SessionData(data.getId(), data.getContextPath(), data.getVhost(), result.getLong(CREATE_COL),
result.getLong(ACCESS_COL), result.getLong(LAST_ACCESS_COL), result.getLong(MAX_IDLE_COL));
SessionData tmp =
new SessionData( data.getId(), data.getContextPath(), data.getVhost(), result.getLong(CREATE_COL),
result.getLong(ACCESS_COL), result.getLong(LAST_ACCESS_COL),
result.getLong(MAX_IDLE_COL));

try (InputStream is = blob.getBinaryStream();
ClassLoadingObjectInputStream ois = new ClassLoadingObjectInputStream(is))
if (blob.length() > 0)
{

SessionData.deserializeAttributes(tmp, ois);
try (InputStream is = blob.getBinaryStream();
ClassLoadingObjectInputStream ois = new ClassLoadingObjectInputStream(is))
{
SessionData.deserializeAttributes(tmp, ois);
}
}

//same number of attributes
assertEquals(data.getAllAttributes().size(), tmp.getAllAttributes().size());
//same keys
Expand Down

0 comments on commit ccf04a4

Please sign in to comment.