修复系统未正确关闭数据库连接导致相关功能会出现无法响应的BUG

This commit is contained in:
datagear 2021-01-28 09:56:00 +08:00
parent f0e28e4941
commit 5b2756a4ed
2 changed files with 75 additions and 50 deletions

View File

@ -1,7 +1,7 @@
/*
* Copyright 2018 datagear.tech
*
* Licensed under the LGPLv3 license:
* Copyright 2018 datagear.tech
*
* Licensed under the LGPLv3 license:
* http://www.gnu.org/licenses/lgpl-3.0.html
*/
@ -27,11 +27,12 @@ import org.datagear.analysis.ResolvableDataSet;
import org.datagear.analysis.ResolvedDataSetResult;
import org.datagear.util.JDBCCompatiblity;
import org.datagear.util.JdbcSupport;
import org.datagear.util.JdbcUtil;
import org.datagear.util.QueryResultSet;
import org.datagear.util.Sql;
import org.datagear.util.SqlType;
import org.datagear.util.resource.ConnectionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* SQL {@linkplain DataSet}
@ -44,6 +45,8 @@ import org.datagear.util.resource.ConnectionFactory;
*/
public class SqlDataSet extends AbstractResolvableDataSet implements ResolvableDataSet
{
private static final Logger LOGGER = LoggerFactory.getLogger(SqlDataSet.class);
protected static final JdbcSupport JDBC_SUPPORT = new JdbcSupport();
private ConnectionFactory connectionFactory;
@ -107,58 +110,63 @@ public class SqlDataSet extends AbstractResolvableDataSet implements ResolvableD
try
{
cn = getConnectionFactory().get();
}
catch (Throwable t)
{
JdbcUtil.closeConnection(cn);
throw new SqlDataSetConnectionException(t);
}
try
{
cn = getConnectionFactory().get();
}
catch (Throwable t)
{
throw new SqlDataSetConnectionException(t);
}
Sql sqlObj = Sql.valueOf(sql);
Sql sqlObj = Sql.valueOf(sql);
JdbcSupport jdbcSupport = getJdbcSupport();
JdbcSupport jdbcSupport = getJdbcSupport();
QueryResultSet qrs = null;
QueryResultSet qrs = null;
try
{
qrs = jdbcSupport.executeQuery(cn, sqlObj, ResultSet.TYPE_FORWARD_ONLY);
}
catch (Throwable t)
{
throw new SqlDataSetSqlExecutionException(sql, t);
}
try
{
qrs = jdbcSupport.executeQuery(cn, sqlObj, ResultSet.TYPE_FORWARD_ONLY);
}
catch (Throwable t)
{
throw new SqlDataSetSqlExecutionException(sql, t);
}
try
{
ResultSet rs = qrs.getResultSet();
ResolvedDataSetResult result = resolveResult(cn, rs, properties, dataSetOption);
TemplateResolvedDataSetResult dataSetResult = null;
return new TemplateResolvedDataSetResult(result.getResult(), result.getProperties(), sql);
}
catch (DataSetException e)
{
throw e;
}
catch (Throwable t)
{
throw new DataSetException(t);
try
{
ResultSet rs = qrs.getResultSet();
ResolvedDataSetResult result = resolveResult(cn, rs, properties, dataSetOption);
dataSetResult = new TemplateResolvedDataSetResult(result.getResult(), result.getProperties(), sql);
}
catch (DataSetException e)
{
throw e;
}
catch (Throwable t)
{
throw new DataSetException(t);
}
QueryResultSet.close(qrs);
return dataSetResult;
}
finally
{
try
{
QueryResultSet.close(qrs);
}
finally
if (cn != null)
{
try
{
getConnectionFactory().release(cn);
}
catch (Exception e)
catch (Throwable t)
{
LOGGER.error("Release connection error", t);
}
}
}

View File

@ -1,7 +1,7 @@
/*
* Copyright 2018 datagear.tech
*
* Licensed under the LGPLv3 license:
* Copyright 2018 datagear.tech
*
* Licensed under the LGPLv3 license:
* http://www.gnu.org/licenses/lgpl-3.0.html
*/
@ -171,6 +171,9 @@ public abstract class AbstractSchemaConnController extends AbstractController
/**
* 抽象模式连接执行器
* <p>
* 注意此类并非线程安全的
* </p>
*
* @author datagear@163.com
*
@ -219,12 +222,11 @@ public abstract class AbstractSchemaConnController extends AbstractController
protected void doExecute() throws Throwable
{
this._schema = getSchemaForUserNotNull(request, response, schemaId);
springModel.addAttribute("schema", this._schema);
try
{
this._schema = getSchemaForUserNotNull(request, response, schemaId);
springModel.addAttribute("schema", this._schema);
doExecute(request, response, springModel, this._schema);
if (!customCommit)
@ -238,11 +240,20 @@ public abstract class AbstractSchemaConnController extends AbstractController
}
finally
{
if (this._cn != null)
JdbcUtil.closeConnection(this._cn);
JdbcUtil.closeConnection(this._cn);
}
}
/**
* 获取当前连接
* <p>
* 注意如果此方法在{@linkplain #doExecute(HttpServletRequest, HttpServletResponse, org.springframework.ui.Model, Schema)}内调用
* 则不需关闭连接否则需自行关闭连接
* </p>
*
* @return
* @throws Exception
*/
protected Connection getConnection() throws Exception
{
if (this._cn == null)
@ -289,6 +300,9 @@ public abstract class AbstractSchemaConnController extends AbstractController
/**
* 返回值{@linkplain AbstractSchemaConnExecutor}
* <p>
* 注意此类并非线程安全的
* </p>
*
* @author datagear@163.com
*
@ -341,6 +355,9 @@ public abstract class AbstractSchemaConnController extends AbstractController
/**
* 无返回值{@linkplain AbstractSchemaConnExecutor}
* <p>
* 注意此类并非线程安全的
* </p>
*
* @author datagear@163.com
*