提交 7be88388 编写于 作者: S Serge Rider

Cache model improvement (use single object lookup)

上级 c06ebaa0
......@@ -701,6 +701,7 @@ public class OracleSchema extends OracleGlobalObject implements DBSSchema, DBPRe
*/
static class ProceduresCache extends JDBCObjectLookupCache<OracleSchema, OracleProcedureStandalone> {
@NotNull
@Override
public JDBCStatement prepareLookupStatement(@NotNull JDBCSession session, @NotNull OracleSchema owner, @Nullable OracleProcedureStandalone object, @Nullable String objectName) throws SQLException {
JDBCPreparedStatement dbStat = session.prepareStatement(
......
......@@ -40,7 +40,7 @@ public interface DBSObjectCache<OWNER extends DBSObject, OBJECT extends DBSObjec
Collection<OBJECT> getCachedObjects();
@Nullable
OBJECT getObject(@NotNull DBRProgressMonitor monitor, @Nullable OWNER owner, @NotNull String name)
OBJECT getObject(@NotNull DBRProgressMonitor monitor, @NotNull OWNER owner, @NotNull String name)
throws DBException;
@Nullable
......
......@@ -73,7 +73,7 @@ public abstract class JDBCObjectCache<OWNER extends DBSObject, OBJECT extends DB
}
@Override
public OBJECT getObject(@NotNull DBRProgressMonitor monitor, @Nullable OWNER owner, @NotNull String name)
public OBJECT getObject(@NotNull DBRProgressMonitor monitor, @NotNull OWNER owner, @NotNull String name)
throws DBException
{
if (!isFullyCached()) {
......
......@@ -39,14 +39,36 @@ public abstract class JDBCObjectLookupCache<OWNER extends DBSObject, OBJECT exte
protected JDBCObjectLookupCache() {
}
public OBJECT refreshObject(@NotNull DBRProgressMonitor monitor, @Nullable OWNER owner, @NotNull OBJECT oldObject)
@Override
public OBJECT getObject(@NotNull DBRProgressMonitor monitor, @NotNull OWNER owner, @NotNull String name)
throws DBException
{
OBJECT cachedObject = getCachedObject(name);
if (cachedObject != null) {
return cachedObject;
}
if (isFullyCached()) {
return null;
}
// Now cache just one object
OBJECT object = reloadObject(monitor, owner, null, name);
if (object != null) {
cacheObject(object);
} else {
// Not found!
// Maybe we need to mark this somehow in cache
}
return object;
}
public OBJECT refreshObject(@NotNull DBRProgressMonitor monitor, @NotNull OWNER owner, @NotNull OBJECT oldObject)
throws DBException
{
String objectName = oldObject.getName();
if (!isFullyCached()) {
this.loadObjects(monitor, owner);
} else {
OBJECT newObject = this.reloadObject(monitor, owner, oldObject);
OBJECT newObject = this.reloadObject(monitor, owner, oldObject, null);
removeObject(oldObject);
if (newObject != null) {
cacheObject(newObject);
......@@ -56,15 +78,15 @@ public abstract class JDBCObjectLookupCache<OWNER extends DBSObject, OBJECT exte
return getCachedObject(objectName);
}
protected OBJECT reloadObject(DBRProgressMonitor monitor, OWNER owner, OBJECT object)
protected OBJECT reloadObject(@NotNull DBRProgressMonitor monitor, @NotNull OWNER owner, @Nullable OBJECT object, @Nullable String objectName)
throws DBException
{
DBPDataSource dataSource = owner.getDataSource();
if (dataSource == null) {
throw new DBException("Not connected to database");
}
try (JDBCSession session = DBUtils.openMetaSession(monitor, dataSource, "Reload object '" + object.getName() + "' from " + owner.getName())) {
try (JDBCStatement dbStat = prepareLookupStatement(session, owner, object, null)) {
try (JDBCSession session = DBUtils.openMetaSession(monitor, dataSource, "Reload object '" + object + "' from " + owner.getName())) {
try (JDBCStatement dbStat = prepareLookupStatement(session, owner, object, objectName)) {
dbStat.setFetchSize(1);
dbStat.executeStatement();
JDBCResultSet dbResult = dbStat.getResultSet();
......
......@@ -223,7 +223,7 @@ public abstract class JDBCStructCache<OWNER extends DBSObject, OBJECT extends DB
loadChildren(monitor, owner, forObject);
synchronized (childrenCache) {
SimpleObjectCache<OBJECT, CHILD> nestedCache = childrenCache.get(forObject);
return nestedCache == null ? null : nestedCache.getObject(monitor, null, objectName);
return nestedCache == null ? null : nestedCache.getObject(monitor, forObject, objectName);
}
}
......
......@@ -42,14 +42,36 @@ public abstract class JDBCStructLookupCache<OWNER extends DBSObject, OBJECT exte
super(objectNameColumn);
}
public OBJECT refreshObject(@NotNull DBRProgressMonitor monitor, @Nullable OWNER owner, @NotNull OBJECT oldObject)
@Override
public OBJECT getObject(@NotNull DBRProgressMonitor monitor, @NotNull OWNER owner, @NotNull String name)
throws DBException
{
OBJECT cachedObject = getCachedObject(name);
if (cachedObject != null) {
return cachedObject;
}
if (isFullyCached()) {
return null;
}
// Now cache just one object
OBJECT object = reloadObject(monitor, owner, null, name);
if (object != null) {
cacheObject(object);
} else {
// Not found!
// Maybe we need to mark this somehow in cache
}
return object;
}
public OBJECT refreshObject(@NotNull DBRProgressMonitor monitor, @NotNull OWNER owner, @NotNull OBJECT oldObject)
throws DBException
{
String objectName = oldObject.getName();
if (!isFullyCached()) {
this.loadObjects(monitor, owner);
} else {
OBJECT newObject = this.reloadObject(monitor, owner, oldObject);
OBJECT newObject = this.reloadObject(monitor, owner, oldObject, null);
if (isChildrenCached(oldObject)) {
clearChildrenCache(oldObject);
}
......@@ -63,15 +85,15 @@ public abstract class JDBCStructLookupCache<OWNER extends DBSObject, OBJECT exte
}
protected OBJECT reloadObject(DBRProgressMonitor monitor, OWNER owner, OBJECT object)
protected OBJECT reloadObject(@NotNull DBRProgressMonitor monitor, @NotNull OWNER owner, @Nullable OBJECT object, @Nullable String objectName)
throws DBException
{
DBPDataSource dataSource = owner.getDataSource();
if (dataSource == null) {
throw new DBException("Not connected to database");
}
try (JDBCSession session = DBUtils.openMetaSession(monitor, dataSource, "Reload object '" + object.getName() + "' from " + owner.getName())) {
try (JDBCStatement dbStat = prepareLookupStatement(session, owner, object, null)) {
try (JDBCSession session = DBUtils.openMetaSession(monitor, dataSource, "Reload object '" + object + "' from " + owner.getName())) {
try (JDBCStatement dbStat = prepareLookupStatement(session, owner, object, objectName)) {
dbStat.setFetchSize(1);
dbStat.executeStatement();
JDBCResultSet dbResult = dbStat.getResultSet();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册