IDEMPIERE-5256 Add Cache to MSession (#1282)
This commit is contained in:
parent
fb6aba0287
commit
ef929dfae5
|
@ -20,13 +20,14 @@ import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Vector;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import org.compiere.Adempiere;
|
import org.compiere.Adempiere;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
import org.compiere.util.TimeUtil;
|
import org.compiere.util.TimeUtil;
|
||||||
import org.compiere.util.WebUtil;
|
import org.compiere.util.WebUtil;
|
||||||
|
import org.idempiere.cache.ImmutableIntPOCache;
|
||||||
|
import org.idempiere.cache.ImmutablePOSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Session Model.
|
* Session Model.
|
||||||
|
@ -39,7 +40,7 @@ import org.compiere.util.WebUtil;
|
||||||
* <li>BF [ 1810182 ] Session lost after cache reset
|
* <li>BF [ 1810182 ] Session lost after cache reset
|
||||||
* <li>BF [ 1892156 ] MSession is not really cached
|
* <li>BF [ 1892156 ] MSession is not really cached
|
||||||
*/
|
*/
|
||||||
public class MSession extends X_AD_Session
|
public class MSession extends X_AD_Session implements ImmutablePOSupport
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -52,30 +53,47 @@ public class MSession extends X_AD_Session
|
||||||
* @param ctx context
|
* @param ctx context
|
||||||
* @param createNew create if not found
|
* @param createNew create if not found
|
||||||
* @return session session
|
* @return session session
|
||||||
|
* @deprecated get (Properties ctx, boolean createNew, boolean isCache) for caching support
|
||||||
*/
|
*/
|
||||||
public static MSession get (Properties ctx, boolean createNew)
|
public static MSession get (Properties ctx, boolean createNew)
|
||||||
|
{
|
||||||
|
return get(ctx, createNew, false);
|
||||||
|
} // get
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get existing or create local session
|
||||||
|
* @param ctx context
|
||||||
|
* @param createNew create if not found
|
||||||
|
* @param isImmutable return Immutable Session Object (from Cache)
|
||||||
|
* @return session session
|
||||||
|
*/
|
||||||
|
public static MSession get (Properties ctx, boolean createNew, boolean isImmutable)
|
||||||
{
|
{
|
||||||
int AD_Session_ID = Env.getContextAsInt(ctx, Env.AD_SESSION_ID);
|
int AD_Session_ID = Env.getContextAsInt(ctx, Env.AD_SESSION_ID);
|
||||||
MSession session = null;
|
MSession session = isImmutable ? s_sessions.get(ctx, AD_Session_ID, e -> new MSession(ctx, e)) : new MSession(ctx, AD_Session_ID, null);
|
||||||
// Try to load
|
// Try to load
|
||||||
if (AD_Session_ID > 0 && s_sessions.contains(AD_Session_ID))
|
if (isImmutable && session == null && AD_Session_ID > 0)
|
||||||
{
|
{
|
||||||
session = new MSession(ctx, AD_Session_ID, null);
|
session = new MSession(ctx, AD_Session_ID, null);
|
||||||
if (session.get_ID() != AD_Session_ID)
|
if (session.get_ID () == AD_Session_ID)
|
||||||
|
{
|
||||||
|
s_sessions.put (AD_Session_ID, session, e -> new MSession(Env.getCtx(), e));
|
||||||
|
} else
|
||||||
{
|
{
|
||||||
session = null;
|
session = null;
|
||||||
s_sessions.remove(AD_Session_ID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Create New
|
// Create New
|
||||||
if (session == null && createNew)
|
if (session == null && createNew)
|
||||||
{
|
{
|
||||||
session = new MSession (ctx, null); // local session
|
session = new MSession (ctx, (String)null); // local session
|
||||||
session.saveEx();
|
session.saveEx();
|
||||||
AD_Session_ID = session.getAD_Session_ID();
|
AD_Session_ID = session.getAD_Session_ID();
|
||||||
Env.setContext (ctx, Env.AD_SESSION_ID, AD_Session_ID);
|
Env.setContext (ctx, Env.AD_SESSION_ID, AD_Session_ID);
|
||||||
s_sessions.add (Integer.valueOf(AD_Session_ID));
|
if(isImmutable)
|
||||||
|
s_sessions.put (AD_Session_ID, session, e -> new MSession(Env.getCtx(), e));
|
||||||
}
|
}
|
||||||
|
|
||||||
return session;
|
return session;
|
||||||
} // get
|
} // get
|
||||||
|
|
||||||
|
@ -86,34 +104,42 @@ public class MSession extends X_AD_Session
|
||||||
* @param Remote_Host remote host
|
* @param Remote_Host remote host
|
||||||
* @param WebSession web session
|
* @param WebSession web session
|
||||||
* @return session
|
* @return session
|
||||||
|
* @deprecated use get (Properties ctx, String Remote_Addr, String Remote_Host, String WebSession, boolean isCache)
|
||||||
*/
|
*/
|
||||||
public static MSession get (Properties ctx, String Remote_Addr, String Remote_Host, String WebSession)
|
public static MSession get (Properties ctx, String Remote_Addr, String Remote_Host, String WebSession)
|
||||||
|
{
|
||||||
|
return get(ctx, Remote_Addr, Remote_Host, WebSession, false);
|
||||||
|
} // get
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get existing or create remote session
|
||||||
|
* @param ctx context
|
||||||
|
* @param Remote_Addr remote address
|
||||||
|
* @param Remote_Host remote host
|
||||||
|
* @param WebSession web session
|
||||||
|
* @param isImmutable return Immutable Object (from Cache)
|
||||||
|
* @return session
|
||||||
|
*/
|
||||||
|
public static MSession get (Properties ctx, String Remote_Addr, String Remote_Host, String WebSession, boolean isImmutable)
|
||||||
{
|
{
|
||||||
int AD_Session_ID = Env.getContextAsInt(ctx, Env.AD_SESSION_ID);
|
int AD_Session_ID = Env.getContextAsInt(ctx, Env.AD_SESSION_ID);
|
||||||
MSession session = null;
|
MSession session = get(ctx, false, isImmutable);
|
||||||
// Try to load
|
|
||||||
if (AD_Session_ID > 0 && s_sessions.contains(AD_Session_ID))
|
|
||||||
{
|
|
||||||
session = new MSession(ctx, AD_Session_ID, null);
|
|
||||||
if (session.get_ID() != AD_Session_ID)
|
|
||||||
{
|
|
||||||
session = null;
|
|
||||||
s_sessions.remove(AD_Session_ID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (session == null)
|
if (session == null)
|
||||||
{
|
{
|
||||||
session = new MSession (ctx, Remote_Addr, Remote_Host, WebSession, null); // remote session
|
session = new MSession (ctx, Remote_Addr, Remote_Host, WebSession, null); // remote session
|
||||||
session.saveEx();
|
session.saveEx();
|
||||||
AD_Session_ID = session.getAD_Session_ID();
|
AD_Session_ID = session.getAD_Session_ID();
|
||||||
Env.setContext(ctx, Env.AD_SESSION_ID, AD_Session_ID);
|
Env.setContext(ctx, Env.AD_SESSION_ID, AD_Session_ID);
|
||||||
s_sessions.add(Integer.valueOf(AD_Session_ID));
|
if(isImmutable)
|
||||||
|
s_sessions.put (AD_Session_ID, session, e -> new MSession(Env.getCtx(), e));
|
||||||
}
|
}
|
||||||
|
|
||||||
return session;
|
return session;
|
||||||
} // get
|
} // get
|
||||||
|
|
||||||
/** Sessions */
|
/** Session Cache */
|
||||||
private static Vector<Integer> s_sessions = new Vector<>();
|
private static ImmutableIntPOCache<Integer,MSession> s_sessions = new ImmutableIntPOCache<Integer,MSession>(Table_Name, 20);
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -194,6 +220,37 @@ public class MSession extends X_AD_Session
|
||||||
}
|
}
|
||||||
} // MSession
|
} // MSession
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param copy
|
||||||
|
*/
|
||||||
|
public MSession(MSession copy)
|
||||||
|
{
|
||||||
|
this(Env.getCtx(), copy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param ctx
|
||||||
|
* @param copy
|
||||||
|
*/
|
||||||
|
public MSession(Properties ctx, MSession copy)
|
||||||
|
{
|
||||||
|
this(ctx, copy, (String) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param ctx
|
||||||
|
* @param copy
|
||||||
|
* @param trxName
|
||||||
|
*/
|
||||||
|
public MSession(Properties ctx, MSession copy, String trxName)
|
||||||
|
{
|
||||||
|
this(ctx, 0, trxName);
|
||||||
|
copyPO(copy);
|
||||||
|
}
|
||||||
|
|
||||||
/** Web Store Session */
|
/** Web Store Session */
|
||||||
private boolean m_webStoreSession = false;
|
private boolean m_webStoreSession = false;
|
||||||
|
|
||||||
|
@ -330,5 +387,14 @@ public class MSession extends X_AD_Session
|
||||||
public static int getCachedSessionCount() {
|
public static int getCachedSessionCount() {
|
||||||
return s_sessions.size()-1;
|
return s_sessions.size()-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MSession markImmutable() {
|
||||||
|
if (is_Immutable())
|
||||||
|
return this;
|
||||||
|
|
||||||
|
makeImmutable();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
} // MSession
|
} // MSession
|
||||||
|
|
||||||
|
|
|
@ -2661,7 +2661,7 @@ public abstract class PO
|
||||||
lobReset();
|
lobReset();
|
||||||
|
|
||||||
// Change Log
|
// Change Log
|
||||||
MSession session = MSession.get (p_ctx, false);
|
MSession session = MSession.get (p_ctx, false, true);
|
||||||
if (session == null)
|
if (session == null)
|
||||||
log.fine("No Session found");
|
log.fine("No Session found");
|
||||||
int AD_ChangeLog_ID = 0;
|
int AD_ChangeLog_ID = 0;
|
||||||
|
@ -3123,7 +3123,7 @@ public abstract class PO
|
||||||
lobReset();
|
lobReset();
|
||||||
|
|
||||||
// Change Log
|
// Change Log
|
||||||
MSession session = MSession.get (p_ctx, false);
|
MSession session = MSession.get (p_ctx, false, true);
|
||||||
if (session == null)
|
if (session == null)
|
||||||
log.fine("No Session found");
|
log.fine("No Session found");
|
||||||
int AD_ChangeLog_ID = 0;
|
int AD_ChangeLog_ID = 0;
|
||||||
|
@ -3719,7 +3719,7 @@ public abstract class PO
|
||||||
if( p_info.isChangeLog())
|
if( p_info.isChangeLog())
|
||||||
{
|
{
|
||||||
// Change Log
|
// Change Log
|
||||||
MSession session = MSession.get (p_ctx, false);
|
MSession session = MSession.get (p_ctx, false, true);
|
||||||
if (session == null)
|
if (session == null)
|
||||||
log.fine("No Session found");
|
log.fine("No Session found");
|
||||||
else if (m_IDs.length == 1)
|
else if (m_IDs.length == 1)
|
||||||
|
|
|
@ -912,7 +912,7 @@ public class ProcessInfo implements Serializable
|
||||||
}
|
}
|
||||||
|
|
||||||
private Timestamp getLastServerRebootDate() {
|
private Timestamp getLastServerRebootDate() {
|
||||||
MSession currentSession = MSession.get(Env.getCtx(), false);
|
MSession currentSession = MSession.get(Env.getCtx(), false, true);
|
||||||
if (currentSession == null)
|
if (currentSession == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
|
|
@ -176,7 +176,7 @@ public final class Env
|
||||||
//hengsin, avoid unncessary query of session when exit without log in
|
//hengsin, avoid unncessary query of session when exit without log in
|
||||||
if (DB.isConnected(false)) {
|
if (DB.isConnected(false)) {
|
||||||
// End Session
|
// End Session
|
||||||
MSession session = MSession.get(Env.getCtx(), false); // finish
|
MSession session = MSession.get(Env.getCtx(), false, false); // finish
|
||||||
if (session != null)
|
if (session != null)
|
||||||
session.logout();
|
session.logout();
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ public final class Env
|
||||||
public static void logout()
|
public static void logout()
|
||||||
{
|
{
|
||||||
// End Session
|
// End Session
|
||||||
MSession session = MSession.get(Env.getCtx(), false); // finish
|
MSession session = MSession.get(Env.getCtx(), false, false); // finish
|
||||||
if (session != null)
|
if (session != null)
|
||||||
session.logout();
|
session.logout();
|
||||||
//
|
//
|
||||||
|
|
|
@ -98,7 +98,7 @@ public class AdempiereActivator extends AbstractActivator {
|
||||||
MSession localSession = null;
|
MSession localSession = null;
|
||||||
//Create Session to be able to create records in AD_ChangeLog
|
//Create Session to be able to create records in AD_ChangeLog
|
||||||
if (Env.getContextAsInt(Env.getCtx(), Env.AD_SESSION_ID) <= 0) {
|
if (Env.getContextAsInt(Env.getCtx(), Env.AD_SESSION_ID) <= 0) {
|
||||||
localSession = MSession.get(Env.getCtx(), true);
|
localSession = MSession.get(Env.getCtx(), true, false);
|
||||||
localSession.setWebSession("AdempiereActivator");
|
localSession.setWebSession("AdempiereActivator");
|
||||||
localSession.saveEx();
|
localSession.saveEx();
|
||||||
}
|
}
|
||||||
|
|
|
@ -212,7 +212,7 @@ public class Incremental2PackActivator extends AbstractActivator {
|
||||||
MSession localSession = null;
|
MSession localSession = null;
|
||||||
//Create Session to be able to create records in AD_ChangeLog
|
//Create Session to be able to create records in AD_ChangeLog
|
||||||
if (Env.getContextAsInt(Env.getCtx(), Env.AD_SESSION_ID) <= 0) {
|
if (Env.getContextAsInt(Env.getCtx(), Env.AD_SESSION_ID) <= 0) {
|
||||||
localSession = MSession.get(Env.getCtx(), true);
|
localSession = MSession.get(Env.getCtx(), true, false);
|
||||||
localSession.setWebSession("Incremental2PackActivator");
|
localSession.setWebSession("Incremental2PackActivator");
|
||||||
localSession.saveEx();
|
localSession.saveEx();
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ public class PackInApplicationActivator extends AbstractActivator{
|
||||||
if (getDBLock()) {
|
if (getDBLock()) {
|
||||||
//Create Session to be able to create records in AD_ChangeLog
|
//Create Session to be able to create records in AD_ChangeLog
|
||||||
if (Env.getContextAsInt(Env.getCtx(), Env.AD_SESSION_ID) <= 0) {
|
if (Env.getContextAsInt(Env.getCtx(), Env.AD_SESSION_ID) <= 0) {
|
||||||
localSession = MSession.get(Env.getCtx(), true);
|
localSession = MSession.get(Env.getCtx(), true, false);
|
||||||
localSession.setWebSession("PackInApplicationActivator");
|
localSession.setWebSession("PackInApplicationActivator");
|
||||||
localSession.saveEx();
|
localSession.saveEx();
|
||||||
}
|
}
|
||||||
|
|
|
@ -151,7 +151,7 @@ public class Version2PackActivator extends AbstractActivator{
|
||||||
if (getDBLock()) {
|
if (getDBLock()) {
|
||||||
//Create Session to be able to create records in AD_ChangeLog
|
//Create Session to be able to create records in AD_ChangeLog
|
||||||
if (Env.getContextAsInt(Env.getCtx(), Env.AD_SESSION_ID) <= 0) {
|
if (Env.getContextAsInt(Env.getCtx(), Env.AD_SESSION_ID) <= 0) {
|
||||||
localSession = MSession.get(Env.getCtx(), true);
|
localSession = MSession.get(Env.getCtx(), true, false);
|
||||||
localSession.setWebSession("Version2PackActivator");
|
localSession.setWebSession("Version2PackActivator");
|
||||||
localSession.saveEx();
|
localSession.saveEx();
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,7 +119,7 @@ public class AdempiereServerMgr implements ServiceTrackerCustomizer<IServerFacto
|
||||||
log.info("");
|
log.info("");
|
||||||
|
|
||||||
// Set Session
|
// Set Session
|
||||||
MSession session = MSession.get(getCtx(), true);
|
MSession session = MSession.get(getCtx(), true, false);
|
||||||
session.setWebStoreSession(false);
|
session.setWebStoreSession(false);
|
||||||
session.setWebSession("Server");
|
session.setWebSession("Server");
|
||||||
session.saveEx();
|
session.saveEx();
|
||||||
|
|
|
@ -132,7 +132,7 @@ public class Scheduler extends AdempiereServer
|
||||||
Env.setContext(getCtx(), Env.DATE, dateFormat4Timestamp.format(ts)+" 00:00:00" ); // JDBC format
|
Env.setContext(getCtx(), Env.DATE, dateFormat4Timestamp.format(ts)+" 00:00:00" ); // JDBC format
|
||||||
|
|
||||||
//Create new Session and set #AD_Session_ID to context
|
//Create new Session and set #AD_Session_ID to context
|
||||||
MSession session = MSession.get(getCtx(), true);
|
MSession session = MSession.get(getCtx(), true, false);
|
||||||
MProcess process = new MProcess(getCtx(), scheduler.getAD_Process_ID(), null);
|
MProcess process = new MProcess(getCtx(), scheduler.getAD_Process_ID(), null);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
@ -273,7 +273,7 @@ public class AdempiereWebUI extends Window implements EventListener<Event>, IWeb
|
||||||
String x_Forward_IP = Executions.getCurrent().getHeader("X-Forwarded-For");
|
String x_Forward_IP = Executions.getCurrent().getHeader("X-Forwarded-For");
|
||||||
|
|
||||||
MSession mSession = MSession.get (ctx, x_Forward_IP!=null ? x_Forward_IP : Executions.getCurrent().getRemoteAddr(),
|
MSession mSession = MSession.get (ctx, x_Forward_IP!=null ? x_Forward_IP : Executions.getCurrent().getRemoteAddr(),
|
||||||
Executions.getCurrent().getRemoteHost(), httpSess.getId() );
|
Executions.getCurrent().getRemoteHost(), httpSess.getId(), false );
|
||||||
if (clientInfo.userAgent != null) {
|
if (clientInfo.userAgent != null) {
|
||||||
mSession.setDescription(mSession.getDescription() + "\n" + clientInfo.toString());
|
mSession.setDescription(mSession.getDescription() + "\n" + clientInfo.toString());
|
||||||
mSession.saveEx();
|
mSession.saveEx();
|
||||||
|
|
|
@ -211,7 +211,7 @@ public final class AEnv
|
||||||
}
|
}
|
||||||
windowCache.remove(sessionID);
|
windowCache.remove(sessionID);
|
||||||
// End Session
|
// End Session
|
||||||
MSession session = MSession.get(Env.getCtx(), false); // finish
|
MSession session = MSession.get(Env.getCtx(), false, false); // finish
|
||||||
if (session != null)
|
if (session != null)
|
||||||
session.logout();
|
session.logout();
|
||||||
|
|
||||||
|
|
|
@ -265,7 +265,7 @@ public class SessionContextListener implements ExecutionInit,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MSession mSession = MSession.get(Env.getCtx(), false);
|
MSession mSession = MSession.get(Env.getCtx(), false, false);
|
||||||
if(mSession!=null && !mSession.isProcessed()) {
|
if(mSession!=null && !mSession.isProcessed()) {
|
||||||
|
|
||||||
mSession.setProcessed(true);
|
mSession.setProcessed(true);
|
||||||
|
@ -318,7 +318,7 @@ public class SessionContextListener implements ExecutionInit,
|
||||||
{
|
{
|
||||||
setupExecutionContextFromSession(Executions.getCurrent());
|
setupExecutionContextFromSession(Executions.getCurrent());
|
||||||
}
|
}
|
||||||
MSession mSession = MSession.get(Env.getCtx(), false);
|
MSession mSession = MSession.get(Env.getCtx(), false, false);
|
||||||
if(mSession!=null){
|
if(mSession!=null){
|
||||||
if (mSession.isProcessed()) {
|
if (mSession.isProcessed()) {
|
||||||
mSession.setProcessed(false);
|
mSession.setProcessed(false);
|
||||||
|
|
|
@ -288,10 +288,10 @@ public class CompiereService {
|
||||||
Env.setContext(getCtx(), Env.LANGUAGE, m_language.getAD_Language());
|
Env.setContext(getCtx(), Env.LANGUAGE, m_language.getAD_Language());
|
||||||
|
|
||||||
// Create session
|
// Create session
|
||||||
MSession session = MSession.get (getCtx(), false);
|
MSession session = MSession.get (getCtx(), false, false);
|
||||||
if (session == null){
|
if (session == null){
|
||||||
log.fine("No Session found");
|
log.fine("No Session found");
|
||||||
session = MSession.get (getCtx(), true);
|
session = MSession.get (getCtx(), true, false);
|
||||||
}
|
}
|
||||||
session.setWebSession("WebService");
|
session.setWebSession("WebService");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue