aboutsummaryrefslogtreecommitdiffstats
path: root/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java
diff options
context:
space:
mode:
Diffstat (limited to 'dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java')
-rw-r--r--dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java159
1 files changed, 127 insertions, 32 deletions
diff --git a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java
index e21e2be..ee01c1b 100644
--- a/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java
+++ b/dblib/provider/src/main/java/org/openecomp/sdnc/sli/resource/dblib/CachedDataSource.java
@@ -20,12 +20,18 @@
package org.openecomp.sdnc.sli.resource.dblib;
+import java.io.Closeable;
+import java.io.IOException;
import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.sql.Blob;
import java.sql.Connection;
+import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Observer;
@@ -34,12 +40,14 @@ import javax.sql.DataSource;
import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.tomcat.jdbc.pool.PoolExhaustedException;
import org.openecomp.sdnc.sli.resource.dblib.config.BaseDBConfiguration;
import org.openecomp.sdnc.sli.resource.dblib.pm.SQLExecutionMonitor;
import org.openecomp.sdnc.sli.resource.dblib.pm.SQLExecutionMonitorObserver;
import org.openecomp.sdnc.sli.resource.dblib.pm.SQLExecutionMonitor.TestObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException;
/**
@@ -65,11 +73,15 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
protected boolean initialized = false;
private long interval = 1000;
- private long initisalDelay = 5000;
+ private long initialDelay = 5000;
private long expectedCompletionTime = 50L;
private boolean canTakeOffLine = true;
private long unprocessedFailoverThreshold = 3L;
+ private long nextErrorReportTime = 0L;
+
+ private String globalHostName = null;
+
public CachedDataSource(BaseDBConfiguration jdbcElem) throws DBConfigException
{
@@ -86,7 +98,7 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
return ds.getConnection();
}
- public CachedRowSet getData(String statement, ArrayList<String> arguments) throws SQLException, Throwable
+ public CachedRowSet getData(String statement, ArrayList<Object> arguments) throws SQLException, Throwable
{
TestObject testObject = null;
testObject = monitor.registerRequest();
@@ -99,7 +111,7 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
}
if(LOGGER.isDebugEnabled())
LOGGER.debug("Obtained connection <" + connectionName + ">: "+connection.toString());
- return executePreparedStatement(connection, statement, arguments);
+ return executePreparedStatement(connection, statement, arguments, true);
} finally {
try {
if(connection != null && !connection.isClosed()) {
@@ -115,7 +127,7 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
}
}
- public boolean writeData(String statement, ArrayList<String> arguments) throws SQLException, Throwable
+ public boolean writeData(String statement, ArrayList<Object> arguments) throws SQLException, Throwable
{
TestObject testObject = null;
testObject = monitor.registerRequest();
@@ -128,7 +140,7 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
}
if(LOGGER.isDebugEnabled())
LOGGER.debug("Obtained connection <" + connectionName + ">: "+connection.toString());
- return executeUpdatePreparedStatement(connection, statement, arguments);
+ return executeUpdatePreparedStatement(connection, statement, arguments, true);
} finally {
try {
if(connection != null && !connection.isClosed()) {
@@ -144,7 +156,8 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
}
}
- private CachedRowSet executePreparedStatement(Connection conn, String statement, ArrayList<String> arguments) throws SQLException, Throwable {
+ CachedRowSet executePreparedStatement(Connection conn, String statement, ArrayList<Object> arguments, boolean close) throws SQLException, Throwable
+ {
long time = System.currentTimeMillis();
CachedRowSet data = null;
@@ -202,7 +215,7 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
}
try {
- if(conn != null){
+ if(conn != null && close){
conn.close();
conn = null;
}
@@ -214,7 +227,7 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
return data;
}
- private boolean executeUpdatePreparedStatement(Connection conn, String statement, ArrayList<String> arguments) throws SQLException, Throwable {
+ boolean executeUpdatePreparedStatement(Connection conn, String statement, ArrayList<Object> arguments, boolean close) throws SQLException, Throwable {
long time = System.currentTimeMillis();
CachedRowSet data = null;
@@ -226,9 +239,21 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
if(arguments != null)
{
for(int i = 0, max = arguments.size(); i < max; i++){
+ if(arguments.get(i) instanceof Blob) {
+ ps.setBlob(i+1, (Blob)arguments.get(i));
+ } else if(arguments.get(i) instanceof Timestamp) {
+ ps.setTimestamp(i+1, (Timestamp)arguments.get(i));
+ } else if(arguments.get(i) instanceof Integer) {
+ ps.setInt(i+1, (Integer)arguments.get(i));
+ } else if(arguments.get(i) instanceof Long) {
+ ps.setLong(i+1, (Long)arguments.get(i));
+ } else if(arguments.get(i) instanceof Date) {
+ ps.setDate(i+1, (Date)arguments.get(i));
+ } else {
ps.setObject(i+1, arguments.get(i));
}
}
+ }
rs = ps.executeUpdate();
// Point the rowset Cursor to the start
if(LOGGER.isDebugEnabled()){
@@ -256,9 +281,8 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
}
throw exc; // new SQLException(exc);
} finally {
-
try {
- if(conn != null){
+ if(conn != null && close){
conn.close();
conn = null;
}
@@ -321,6 +345,13 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
}
public void cleanUp(){
+ if(ds != null && ds instanceof Closeable) {
+ try {
+ ((Closeable)ds).close();
+ } catch (IOException e) {
+ LOGGER.warn(e.getMessage());
+ }
+ }
ds = null;
monitor.deleteObservers();
monitor.cleanup();
@@ -349,11 +380,10 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
{
readOnly = rs.getBoolean(1);
hostname = rs.getString(2);
-// if(rs.getInt(1)==1){
+
if(LOGGER.isDebugEnabled()){
LOGGER.debug("SQL DataSource <"+getDbConnectionName() + "> connected to " + hostname + ", read-only is " + readOnly + ", tested successfully ");
}
-// }
}
} catch (Throwable exc) {
@@ -421,7 +451,7 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
}
public long getInitialDelay() {
- return initisalDelay;
+ return initialDelay;
}
public void setInterval(long value) {
@@ -429,7 +459,7 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
}
public void setInitialDelay(long value) {
- initisalDelay = value;
+ initialDelay = value;
}
public long getExpectedCompletionTime() {
@@ -477,29 +507,20 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
return monitor;
}
- protected boolean isSlave() {
+ protected boolean isSlave() throws PoolExhaustedException, MySQLNonTransientConnectionException {
CachedRowSet rs = null;
boolean isSlave = true;
String hostname = "UNDETERMINED";
try {
-// rs = this.getData("show slave status", new ArrayList<String>());
-// while(rs.next()) {
-// String master = rs.getString(2);
-// LOGGER.debug("database <"+connectionName+"> defines master as " + master);
-// if(master == null || master.isEmpty() || master.equals(this.getDbConnectionName())) {
-// isSlave = false;
-// } else {
-// isSlave = true;
-// }
-// }
-
boolean localSlave = true;
- rs = this.getData("SELECT @@global.read_only, @@global.hostname", new ArrayList<String>());
+ rs = this.getData("SELECT @@global.read_only, @@global.hostname", new ArrayList<Object>());
while(rs.next()) {
localSlave = rs.getBoolean(1);
hostname = rs.getString(2);
}
isSlave = localSlave;
+ } catch(PoolExhaustedException | MySQLNonTransientConnectionException peexc){
+ throw peexc;
} catch (SQLException e) {
LOGGER.error("", e);
isSlave = true;
@@ -508,14 +529,88 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
isSlave = true;
}
if(isSlave){
- LOGGER.debug("SQL SLAVE : "+connectionName + " on server " + hostname);
+ LOGGER.debug("SQL SLAVE : "+connectionName + " on server " + hostname);
} else {
- LOGGER.debug("SQL MASTER : "+connectionName + " on server " + hostname);
+ LOGGER.debug("SQL MASTER : "+connectionName + " on server " + hostname);
}
return isSlave;
}
-
+
public boolean isFabric() {
return false;
}
+
+ protected boolean lockTable(Connection conn, String tableName) {
+ boolean retValue = false;
+ Statement lock = null;
+ try {
+ if(tableName != null) {
+ if(LOGGER.isDebugEnabled()) {
+ LOGGER.debug("Executing 'LOCK TABLES " + tableName + " WRITE' on connection " + conn.toString());
+ if("SVC_LOGIC".equals(tableName)) {
+ Exception e = new Exception();
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ e.printStackTrace(pw);
+ LOGGER.debug(sw.toString());
+ }
+ }
+ lock = conn.createStatement();
+ lock.execute("LOCK TABLES " + tableName + " WRITE");
+ retValue = true;
+ }
+ } catch(Exception exc){
+ LOGGER.error("", exc);
+ retValue = false;
+ } finally {
+ try {
+ lock.close();
+ } catch(Exception exc) {
+
+ }
+ }
+ return retValue;
+ }
+
+ protected boolean unlockTable(Connection conn) {
+ boolean retValue = false;
+ Statement lock = null;
+ try {
+ if(LOGGER.isDebugEnabled()) {
+ LOGGER.debug("Executing 'UNLOCK TABLES' on connection " + conn.toString());
+ }
+ lock = conn.createStatement();
+ retValue = lock.execute("UNLOCK TABLES");
+ } catch(Exception exc){
+ LOGGER.error("", exc);
+ retValue = false;
+ } finally {
+ try {
+ lock.close();
+ } catch(Exception exc) {
+
+ }
+ }
+ return retValue;
+ }
+
+ public void getPoolInfo(boolean allocation) {
+
+ }
+
+ public long getNextErrorReportTime() {
+ return nextErrorReportTime;
+ }
+
+ public void setNextErrorReportTime(long nextTime) {
+ this.nextErrorReportTime = nextTime;
+ }
+
+ public void setGlobalHostName(String hostname) {
+ this.globalHostName = hostname;
+ }
+
+ public String getGlobalHostName() {
+ return globalHostName;
+ }
}