xp tracker service: fix deadlock acquiring connections

This commit is contained in:
Adam
2018-04-25 15:31:09 -04:00
parent fd32f532ac
commit b0225770ac

View File

@@ -62,9 +62,9 @@ public class XpTrackerService
{ {
try (Connection con = sql2o.open()) try (Connection con = sql2o.open())
{ {
PlayerEntity playerEntity = findOrCreatePlayer(username); PlayerEntity playerEntity = findOrCreatePlayer(con, username);
XpEntity currentXp = findXpAtTime(username, Instant.now()); XpEntity currentXp = findXpAtTime(con, username, Instant.now());
if (currentXp != null) if (currentXp != null)
{ {
XpData hiscoreData = XpMapper.INSTANCE.hiscoreResultToXpData(hiscoreResult); XpData hiscoreData = XpMapper.INSTANCE.hiscoreResultToXpData(hiscoreResult);
@@ -139,9 +139,7 @@ public class XpTrackerService
} }
} }
private synchronized PlayerEntity findOrCreatePlayer(String username) private synchronized PlayerEntity findOrCreatePlayer(Connection con, String username)
{
try (Connection con = sql2o.open())
{ {
PlayerEntity playerEntity = con.createQuery("select * from player where name = :name") PlayerEntity playerEntity = con.createQuery("select * from player where name = :name")
.addParameter("name", username) .addParameter("name", username)
@@ -165,11 +163,8 @@ public class XpTrackerService
playerEntity.setTracked_since(now); playerEntity.setTracked_since(now);
return playerEntity; return playerEntity;
} }
}
public XpEntity findXpAtTime(String username, Instant time) private XpEntity findXpAtTime(Connection con, String username, Instant time)
{
try (Connection con = sql2o.open())
{ {
return con.createQuery("select * from xp join player on player.id=xp.player where player.name = :username and time <= :time order by time desc limit 1") return con.createQuery("select * from xp join player on player.id=xp.player where player.name = :username and time <= :time order by time desc limit 1")
.throwOnMappingFailure(false) .throwOnMappingFailure(false)
@@ -177,5 +172,12 @@ public class XpTrackerService
.addParameter("time", time) .addParameter("time", time)
.executeAndFetchFirst(XpEntity.class); .executeAndFetchFirst(XpEntity.class);
} }
public XpEntity findXpAtTime(String username, Instant time)
{
try (Connection con = sql2o.open())
{
return findXpAtTime(con, username, time);
}
} }
} }