[ 1801842 ] DB connection fix & improvements for concurrent threads

- more robust connection and transaction management when using wan and vpn profile.
This commit is contained in:
Heng Sin Low 2007-10-05 10:41:56 +00:00
parent 20eeced360
commit eb5f088788
1 changed files with 131 additions and 9 deletions

View File

@ -119,6 +119,11 @@ public class ServerBean implements SessionBean
int AD_Client_ID, int AD_Table_ID, int Record_ID, boolean force, String trxName) int AD_Client_ID, int AD_Table_ID, int Record_ID, boolean force, String trxName)
{ {
log.info ("[" + m_no + "] Table=" + AD_Table_ID + ", Record=" + Record_ID); log.info ("[" + m_no + "] Table=" + AD_Table_ID + ", Record=" + Record_ID);
if (trxName != null) {
if (Trx.get(trxName, false) == null) {
throw new RuntimeException("Transaction lost - " + trxName);
}
}
m_postCount++; m_postCount++;
MAcctSchema[] ass = MAcctSchema.getClientAcctSchema(ctx, AD_Client_ID); MAcctSchema[] ass = MAcctSchema.getClientAcctSchema(ctx, AD_Client_ID);
return Doc.postImmediate(ass, AD_Table_ID, Record_ID, force, trxName); return Doc.postImmediate(ass, AD_Table_ID, Record_ID, force, trxName);
@ -138,9 +143,12 @@ public class ServerBean implements SessionBean
{ {
validateSecurityToken(token); validateSecurityToken(token);
//log.finer(m_Context.getCallerPrincipal().getName() + " - " + info.getSql());
log.finer("[" + m_no + "]"); if (info.getTrxName() != null) {
if (Trx.get(info.getTrxName(), false) == null)
throw new RuntimeException("Transaction lost - " + info.getTrxName());
}
m_stmt_rowSetCount++; m_stmt_rowSetCount++;
CPreparedStatement pstmt = new CPreparedStatement(info); CPreparedStatement pstmt = new CPreparedStatement(info);
RowSet rowset = null; RowSet rowset = null;
@ -174,8 +182,10 @@ public class ServerBean implements SessionBean
{ {
validateSecurityToken(token); validateSecurityToken(token);
//log.finer(m_Context.getCallerPrincipal().getName() + " - " + info.getSql()); if (info.getTrxName() != null) {
log.finer("[" + m_no + "]"); if (Trx.get(info.getTrxName(), false) == null)
throw new RuntimeException("Transaction lost - " + info.getTrxName());
}
m_stmt_rowSetCount++; m_stmt_rowSetCount++;
CStatement stmt = new CStatement(info); CStatement stmt = new CStatement(info);
RowSet rowset = null; RowSet rowset = null;
@ -209,8 +219,11 @@ public class ServerBean implements SessionBean
{ {
validateSecurityToken(token); validateSecurityToken(token);
//log.finer(m_Context.getCallerPrincipal().getName() + " - " + info.getSql()); if (info.getTrxName() != null) {
log.finer("[" + m_no + "]"); if (Trx.get(info.getTrxName(), false) == null)
throw new RuntimeException("Transaction lost - " + info.getTrxName());
}
m_stmt_updateCount++; m_stmt_updateCount++;
CStatement stmt = null; CStatement stmt = null;
int retVal = -1; int retVal = -1;
@ -255,6 +268,11 @@ public class ServerBean implements SessionBean
*/ */
public int getNextID (int AD_Client_ID, String TableName, String trxName) public int getNextID (int AD_Client_ID, String TableName, String trxName)
{ {
if (trxName != null) {
if (Trx.get(trxName, false) == null) {
throw new RuntimeException("Transaction lost - " + trxName);
}
}
int retValue = MSequence.getNextID (AD_Client_ID, TableName, trxName); int retValue = MSequence.getNextID (AD_Client_ID, TableName, trxName);
log.finer("[" + m_no + "] " + TableName + " = " + retValue); log.finer("[" + m_no + "] " + TableName + " = " + retValue);
m_nextSeqCount++; m_nextSeqCount++;
@ -272,6 +290,11 @@ public class ServerBean implements SessionBean
*/ */
public String getDocumentNo (int AD_Client_ID, String TableName, String trxName) public String getDocumentNo (int AD_Client_ID, String TableName, String trxName)
{ {
if (trxName != null) {
if (Trx.get(trxName, false) == null) {
throw new RuntimeException("Transaction lost - " + trxName);
}
}
m_nextSeqCount++; m_nextSeqCount++;
String dn = MSequence.getDocumentNo (AD_Client_ID, TableName, trxName); String dn = MSequence.getDocumentNo (AD_Client_ID, TableName, trxName);
if (dn == null) // try again if (dn == null) // try again
@ -289,6 +312,11 @@ public class ServerBean implements SessionBean
*/ */
public String getDocumentNo (int C_DocType_ID, String trxName) public String getDocumentNo (int C_DocType_ID, String trxName)
{ {
if (trxName != null) {
if (Trx.get(trxName, false) == null) {
throw new RuntimeException("Transaction lost - " + trxName);
}
}
m_nextSeqCount++; m_nextSeqCount++;
String dn = MSequence.getDocumentNo (C_DocType_ID, trxName); String dn = MSequence.getDocumentNo (C_DocType_ID, trxName);
if (dn == null) // try again if (dn == null) // try again
@ -307,10 +335,16 @@ public class ServerBean implements SessionBean
*/ */
public ProcessInfo process (Properties ctx, ProcessInfo pi) public ProcessInfo process (Properties ctx, ProcessInfo pi)
{ {
m_processCount++; m_processCount++;
// Start Process // Start Process
String trxName = pi.getTransactionName(); String trxName = pi.getTransactionName();
if (trxName != null) {
if (Trx.get(trxName, false) == null) {
throw new RuntimeException("Transaction lost - " + trxName);
}
}
if (trxName == null) trxName = Trx.createTrxName("ServerPrc"); if (trxName == null) trxName = Trx.createTrxName("ServerPrc");
Trx trx = Trx.get(trxName, true); Trx trx = Trx.get(trxName, true);
ProcessUtil.startJavaProcess(ctx, pi, trx); ProcessUtil.startJavaProcess(ctx, pi, trx);
@ -348,6 +382,11 @@ public class ServerBean implements SessionBean
public boolean paymentOnline (Properties ctx, public boolean paymentOnline (Properties ctx,
int C_Payment_ID, int C_PaymentProcessor_ID, String trxName) int C_Payment_ID, int C_PaymentProcessor_ID, String trxName)
{ {
if (trxName != null) {
if (Trx.get(trxName, false) == null) {
throw new RuntimeException("Transaction lost - " + trxName);
}
}
MPayment payment = new MPayment (ctx, C_Payment_ID, trxName); MPayment payment = new MPayment (ctx, C_Payment_ID, trxName);
MPaymentProcessor mpp = new MPaymentProcessor (ctx, C_PaymentProcessor_ID, null); MPaymentProcessor mpp = new MPaymentProcessor (ctx, C_PaymentProcessor_ID, null);
log.info ("[" + m_no + "] " + payment + " - " + mpp); log.info ("[" + m_no + "] " + payment + " - " + mpp);
@ -567,6 +606,56 @@ public class ServerBean implements SessionBean
} // getStatus } // getStatus
/**
* Set savepoint
* @ejb.interface-method view-type="both"
* @param trxName
* @param savePointName
* @return true if success, false otherwise
*/
public SavepointVO setSavepoint(String trxName, String savePointName)
{
Trx trx = Trx.get(trxName, false);
if (trx != null)
{
try
{
Savepoint sp = null;
if (savePointName != null)
sp = trx.getConnection().setSavepoint(savePointName);
else
sp = trx.getConnection().setSavepoint();
return new SavepointVO(sp);
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
}
return null;
}
/**
* Start remote transaction
* @ejb.interface-method view-type="both"
* @param trxName
*/
public void startTransaction(String trxName) {
Trx trx = Trx.get(trxName, true);
trx.start();
}
/**
* Close remote transaction
* @ejb.interface-method view-type="both"
* @param trxName
*/
public void closeTransaction(String trxName) {
Trx trx = Trx.get(trxName, false);
if (trx != null)
trx.close();
}
/** /**
* Commit the named transaction on server * Commit the named transaction on server
* @ejb.interface-method view-type="both" * @ejb.interface-method view-type="both"
@ -623,6 +712,35 @@ public class ServerBean implements SessionBean
return success; return success;
} }
/**
* Rollback the named transaction on server
* @ejb.interface-method view-type="both"
* @param trxName
* @return true if success, false otherwise
*/
public boolean rollback(String trxName, SavepointVO savePoint)
{
boolean success = false;
Trx trx = Trx.get(trxName, false);
if (trx != null)
{
try
{
trx.getConnection().rollback(savePoint);
success = true;
}
catch (SQLException e)
{
throw new RuntimeException(e);
}
finally
{
trx.close();
}
}
return success;
}
/** /**
* Execute db proces on server * Execute db proces on server
* @ejb.interface-method view-type="both" * @ejb.interface-method view-type="both"
@ -636,8 +754,12 @@ public class ServerBean implements SessionBean
validateSecurityToken(token); validateSecurityToken(token);
Trx trx = null; Trx trx = null;
if (trxName != null) if (trxName != null) {
trx = Trx.get(trxName, true); trx = Trx.get(trxName, false);
if (trx == null) {
throw new RuntimeException("Transaction lost - " + trxName);
}
}
ProcessUtil.startDatabaseProcedure(processInfo, procedureName, trx); ProcessUtil.startDatabaseProcedure(processInfo, procedureName, trx);
return processInfo; return processInfo;
} }