docs: void createTable() {
          Connection con = null;
          java.sql.Statement s = null;
  
          //PK55900 We can pass in true to the getConnection method since this method,
          //createTable, is only called from the initDBSettings method.
          con = getConnection(true);
          if (con == null) {
              return;
          }
  
          try {
  
              try {
                  s = con.createStatement();
                  if (!getTableDefinition(con)) {
                      if (usingOracle) {
                          if (_smc.isUseOracleBlob()) { // cmd LI1963 start
                              s.executeUpdate("create table "
                                              + tableName
                                              + " (id varchar(128) not null, propid varchar(128) not null, appname varchar(128) not null, listenercnt smallint, lastaccess integer, creationtime integer, maxinactivetime integer, username varchar(256), small raw("
                                              + SMALLCOL_SIZE_ORACLE + "), medium BLOB, large raw(1))");
                          } else {
                              s.executeUpdate("create table "
                                              + tableName
                                              + " (id varchar(128) not null, propid varchar(128) not null, appname varchar(128) not null, listenercnt smallint, lastaccess integer, creationtime integer, maxinactivetime integer, username varchar(256), small raw("
                                              + SMALLCOL_SIZE_ORACLE + "), medium long raw, large raw(1))");
                          } // cmd LI1963 end
                      } else if (usingAS400DB2) {
                          try { //if using AS400, create collection first
                              s.executeUpdate("CREATE COLLECTION " + collectionName);
                          } catch (Exception e) {
                              com.ibm.ws.ffdc.FFDCFilter.processException(e, "com.ibm.ws.session.store.db.DatabaseHashMap.createTable", "470", con);
                          }
                          s.executeUpdate("create table "
                                          + tableName
                                          + " (id varchar(128) not null, propid varchar(128) not null, appname varchar(128) not null, listenercnt smallint, lastaccess bigint, creationtime bigint, maxinactivetime integer, username varchar(256), small varchar("
                                          + SMALLCOL_SIZE_DB2 + ") for bit data, medium long varchar for bit data, large BLOB(2M))");
                      } else if (usingSybase) {
                          s.executeUpdate("create table "
                                          + tableName
                                          + " (id varchar(128) not null, propid varchar(128) not null, appname varchar(128) not null, listenercnt smallint null, lastaccess numeric(21,0) null, creationtime numeric(21,0) null, maxinactivetime numeric(10,0) null, username varchar(255) null, small image null, medium image null, large image null)");
                      } else if (usingSQLServer) {
                          s.executeUpdate("create table "
                                          + tableName
                                          + " (id varchar(128) not null, propid varchar(128) not null, appname varchar(128) not null, listenercnt smallint null, lastaccess decimal(21,0) null, creationtime decimal(21,0) null, maxinactivetime integer null, username varchar(255) null, small image null, medium image null, large image null)");
                      } else if (usingInformix) {
                          s.executeUpdate("create table "
                                          + tableName
                                          + " (id varchar(128) not null, propid varchar(128) not null, appname varchar(128) not null, listenercnt smallint, lastaccess int8, creationtime int8, maxinactivetime integer, username varchar(255), small BYTE, medium BYTE, large BYTE)");
                      } else if (usingCloudScape) {
                          s.executeUpdate("create table "
                                          + tableName
                                          + " (id varchar(128) not null, propid varchar(128) not null, appname varchar(128) not null, listenercnt smallint, lastaccess bigint, creationtime bigint, maxinactivetime integer, username varchar(255), small LONG VARBINARY , medium char(1) , large char(1))");
                      } else if (dbHandler != null) {
                          dbHandler.createTable(s, tableName);
                      } else if (!usingDB2Connect && !usingDB2zOS) { // LIDB2775.25 zOS
                          String tableSpaceName = " ";
                          // a little overkill for this test
                          String configTableSpaceName = _smc.getTableSpaceName();
                          if (configTableSpaceName != null && !configTableSpaceName.equals("") && configTableSpaceName.length() != 0)
                              tableSpaceName = " in " + configTableSpaceName;
                          if (usingSolidDB)
                              s.executeUpdate("create table "
                                          + tableName
                                          + " (id varchar(128) not null, propid varchar(128) not null, appname varchar(128) not null, listenercnt smallint, lastaccess bigint, creationtime bigint, maxinactivetime integer, username varchar(256), small varchar("
                                          + smallColSize + "), medium long varchar, large BLOB(2M)) " + tableSpaceName);
                          else
                              s.executeUpdate("create table "
                                          + tableName
                                          + " (id varchar(128) not null, propid varchar(128) not null, appname varchar(128) not null, listenercnt smallint, lastaccess bigint, creationtime bigint, maxinactivetime integer, username varchar(256), small varchar("
                                          + smallColSize + ") for bit data, medium long varchar for bit data, large BLOB(2M)) " + tableSpaceName);
                      }
                  }
                  //            } catch (com.ibm.ejs.cm.portability.TableAlreadyExistsException eee) {
                  //                // Do nothing since all is well!!
                  //                com.ibm.ws.ffdc.FFDCFilter.processException(eee, "com.ibm.ws.session.store.db.DatabaseHashMap.createTable", "495", this);
              } catch (SQLException err) {
                  com.ibm.ws.ffdc.FFDCFilter.processException(err, "com.ibm.ws.session.store.db.DatabaseHashMap.createTable", "497", this);
                  if (!usingCloudScape) {
                      LoggingUtil.SESSION_LOGGER_WAS.logp(Level.SEVERE, methodClassName, methodNames[CREATE_TABLE], "CommonMessage.exception", err);
                  } else {
                      if (err.getErrorCode() != 30000)
                          LoggingUtil.SESSION_LOGGER_WAS.logp(Level.SEVERE, methodClassName, methodNames[CREATE_TABLE], "CommonMessage.exception", err);
                  }
              }
  
              if (!_smc.isSessionTableSkipIndexCreation()) { // PM37139
  
                  //Creating index in a seperate step as we have seen customers missing this
                  //step when they create the table manually
                  try {
                      if (s == null)
                          s = con.createStatement();
                      if (usingSybase) {
                          s.executeUpdate("create unique index sess_index on " + tableName + " (id, propid, appname)");
                          s.executeUpdate("alter table sessions lock datarows");
                      } else if (usingSolidDB) {
                          s.executeUpdate("create unique index sess_index on " + tableName + " (id, propid, appname)");
                      } else if (usingAS400DB2) {
                          mediumColSize = mediumColSize - 2; //d154211
                          //PK56991: If multiple cluster members startup at the same time the
                          // combination of these DDLs can lock up for a substantial duration.
                          // We now execute these only if they do not exist.
                          if (!doesIndexExists(con, "sess_index")) {
                              s.executeUpdate("create unique index " + collectionName + ".sess_index on " + tableName + " (id,propid,appname)"); //tableName is already in the form of "collectionName.tableName"
                              //PK56991 comment out marking table as volatile. The DB2 chief architect on iSeries
                              //team informed that VOLATILE clause is only compatible and improve performance on LUW
                              //s.executeUpdate("alter table " + tableName + " volatile");
                          } else if (com.ibm.websphere.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_WAS.isLoggable(Level.FINE)) {
                              LoggingUtil.SESSION_LOGGER_WAS.logp(Level.FINE, methodClassName, methodNames[CREATE_TABLE], "Skip index creation");
                          }
                      } else if (dbHandler != null) {
                          dbHandler.createIndex(con, s, tableName);
                      } else if (!usingDB2Connect && !usingDB2zOS) { // LIDB2775.25
                          //PK56991: Refer to detailed comment above
                          if (!doesIndexExists(con, "sess_index")) {
                              s.executeUpdate("create unique index sess_index on " + tableName + " (id, propid, appname)");//PK86373: changed sesscmd_index to sess_index
                          } else if (com.ibm.websphere.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_WAS.isLoggable(Level.FINE)) {
                              LoggingUtil.SESSION_LOGGER_WAS.logp(Level.FINE, methodClassName, methodNames[CREATE_TABLE], "Skip index creation");
                          }
                          //PK56991: We are marking the the session table as volatile if it is not
                          //done yet.
                          if (usingDB2 && !isTableMarkedVolatile(con)) {
                              s.executeUpdate("alter table " + tableName + " volatile");
                          } else if (com.ibm.websphere.ras.TraceComponent.isAnyTracingEnabled() && LoggingUtil.SESSION_LOGGER_WAS.isLoggable(Level.FINE)) {
                              LoggingUtil.SESSION_LOGGER_WAS.logp(Level.FINE, methodClassName, methodNames[CREATE_TABLE], "Skip marking table volatile");
                          }
  
                      }
                  } catch (SQLException err) {
                      //Don't do any thing if it is only index already exists
                      //err.printStackTrace();
                      com.ibm.ws.ffdc.FFDCFilter.processException(err, "com.ibm.ws.session.store.db.DatabaseHashMap.createTable", "526", con);
                  }
              } // END PM37139
          } finally {
              if (s != null)
                  closeStatement(s);
                  closeConnection(con); //findbugs for 106329
          }
      }