📄 prov_query_disc.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta name="Author" content="TF">
<meta name="generator" content="HTML Tidy, see www.w3.org">
<title>数据库应用程序开发者指南:从一个数据源中获得数据</title>
<link type="text/css" href="jbdocs.css" rel="stylesheet">
</head>
<body>
<a name="_top_"></a>
<h3>查询一个数据库: 提示与技巧</h3>
<hr>
译者名字:cage_yang(JD012)<br>
邮件地址:<a href="mailto:cage_yang@163.com">cage_yang@163.com</a>
<blockquote class="bsku">数据库应用程序开发是JBuilder专业版本与企业版本的一个特征.分布式应用程序是JBuilder企业版本的一个特征.</blockquote>
<p>帮助提示技巧</p>
<ul>
<li>提高数据集性能</li>
<li>有效地打开与关闭数据集</li>
<li>确保存查询可更新</li>
</ul>
<a name="tuning"></a>
<h4>提高数据集性能</h4>
<!--BNDX="QueryDataSet component:overview;performance:enhancing data set;data sets:enhancing performance"-->
<!--BNDX="data retrieval enhancements;fetching data:optimizing;optimizing data retrieval"-->
<p>本部分提供一些调整<code>QueryDataSet</code>和<code>QueryProvider</code> 性能的小技巧.另见"<a href="#persistingmetadata">持续化一个查询元数据</a>". </p>
<ul>
<li>
<p>设置<code>Query/ProcedureDataSet</code>的<a href="../ref/dx/com.borland.dx.sql.dataset.QueryDescriptor.html"><code>loadOption</code></a>属性为Load.ASYNCHRONOUS</code> 或 <code>Load.AS_NEEDED</code>.如果你将一次性地读取数据也可以设置属性为<code>Load.UNCACHED</code>.</p>
</li>
<li>
<p>对于大的结果集,可以使用<code>JDataStore</code>来提高性能.在这种选择下,数据保存在磁盘上而不是内存中.</p>
</li>
<li>
<p>高速缓冲SQL语句.默认情况下,如果 <code>java.sql.Connection.getMetaData().getMaxStatements()</code>返回一个大于10的值,DataExpress会高速缓冲准备好的语句,包括查询与存储过程.在JBuilder中你能够通过调用<code>Database.setUseStatementCaching(true)</code>语句强制高速缓冲.</p>
<p>高速缓冲的准备好的语句不会关闭,直到以下的其中一个情况发生:</p>
<ul>
<li>某些数据提供者相关属性,如<code>query</code>属性被改变.</li>
<li>一个<code>DataSet</code>组件是当垃圾收集</li>
<li><code>QueryDataSet.closeStatement()</code>, <code>ProcedureDataSet.closeStatement()</code>, <code>QueryProvider.closeStatement()</code>, 或者 <code>ProcedureProvider.closeStatement()</code> 被调用.</li>
</ul>
</li>
</ul>
<p>想在数据插入/删除/更新过程中提高性能:</p>
<ul>
<li>更新删除,
<ol>
<li>
<p>为<code>QueryResolver</code>设置一个提交属性.</p>
</li>
<li>设置<code>QueryResolver</code>的<code>UpdateMode</code>属性为<code>UpdateMode.KEY_COLUMNS</code>.</li>
</ol>
<p>这些作用水削弱了并发性的使用,但减少了更新/删除操作的参数数量.</p>
</li>
<li>
<p>设置<code>Database</code>的<code>useTransactions</code>属性为<code>false</code>.
如果数据支持事务该属性默认值是<code>true</code>.当它为true时,每条insert, delete,或者update 语句被单独处理,自动提交事务.当你设置<code>useTransactions</code>为<code>false</code>时,语句都在一个单一的事务中被处理.</p>
<p><span class="bscan">注意:</span>在这种情形下,你一定要调用<code>Database</code>或者<code>Connection</code>的<code>commit()</code>方法来完成事务(或者调用<code>rollback()</code>放弃所有的变化).</p>
</li>
<li>
<p>使在<code>Database.saveChanges()</code>方法的<code>resetPendingStatus</code>标记为不可用以达到进一步的性能好处.不可用时, DataExpress对于所有的inserted/deleted/updated行不会清除<code>RowStatus</code>状态. 对<code>DataSet</code>进行新的编辑时,在没有先调用<code>refresh</code>的情况下,如果你没有调用<code>saveChanges()</code>,这是不错的.</p>
</li>
</ul>
<a name="persistingmetadata"></a>
<h4>持续化元数据</h4>
<!--BNDX="metadata:persisting"-->
<p>默认情况下,一个查询在第一次执行时进行分析.分析包括解析查询串并调用几个JDBC驱动器方法. 该分析是非常花费的. 你能够移至运行前进行分析,因此,在设计窗体或者数据模块之间执行分析. </p>
<p>要做到它,</p>
<ol>
<li>在设计器中突出<code>QueryDataSet</code>,右击它,选择Activate Designer项.</li>
<li>在列设计器中按下"Persist All Metadata" 按钮.</li>
</ol>
<p>查询现在被分析,一组属性设置被添加到代码中.更多的关于Persist All Metadata按钮的讨论见<a href="col_columns.html">"利用列设计器持续化元数据"</a>. 要不用设计器设置属性, </p>
<ol>
<li>设置<code>StorageDataSet</code>的<code>metaUpdate</code>属性为NONE.</li>
<li>设置<code>StorageDataSet</code>的<code>tableName</code> 属性为单表查询.</li>
<li>设置<code>Column</code>的<code>rowID</code>以便它们唯一并有效标识一行.</li>
<li>改变查询串以包括标识行的列,如果还没有包括的情况下. 在如此<code>Column</code>的<code>visible</code>或<code>hidden</code>属性设置情况下该列将被标记为不可见的.</li>
<li>设置列属性<code>precision</code>, <code>scale</code>, 与 <code>searchable</code>为适当的值. 如果<code>metaDataUpdate</code>属性不为NONE的情况下这些属性不是必需的.</li>
<li>设置<code>Column</code>的<code>tableName</code>属性为多表查询.</li>
<li>如果在查询中为一列使用了别名,设置<code>Column</code>的<code>serverColumnName</code>属性为相应的物理的表的列的名称.
</li>
</ol>
<a name="openclose"></a>
<h4>打开与关闭数据集</h4>
<!--BNDX="data sets:explicitly opening;data sets:closing;opening:data sets;closing:data sets"-->
<p>当组件绑定到<code>Database</code>与<code>DataSet</code>时,它们是隐式打开的.当你没有用可视化组件时,你一定要明确地打开一个<code>DataSet</code>. "Open"向上传播并且 "close"向下传播,因此打开一个<code>DataSet</code>就隐式地打开了一个code>Database</code>. 一个<code>Database</code>不会隐式地被关掉. </p>
<a name="updateable"></a>
<h4>确保一个查询是可更新的</h4>
<!--BNDX="queries:ensuring updateability;SQL queries:ensuring updateability"-->
<!--BNDX="data sets:returning as read-only;read-only data sets"-->
<p>当JBuilder执行一个查询时,它尝试确信查询是可更新的并且它能够提交至数据库.如果JBuilder 确定查询是不可更新的,会尽量修改查询以使它为可更新的,典型的就是增加列到SELECT子句中.</p>
<p>如果一个查询被发现是不可更新的并且JBuilder不能够将它改变为可更新的查询,结果集会设置为只读.</p>
<p>要使任何数据集为可更新的,设置<code>updateMetaData</code>属性为<strong>NONE</strong>并指定数据集的表名与唯一的标识列(某些列能够唯一标识一行,例如主列或者唯一索引). 关于怎样设置的信息见See "<a href="#persistingmetadata">一个查询的持续化元数据</a>".</p>
<p>你能够查询一个SQL视图,但数据集不能确保为可更新的.你能够写一个<a href="res_customizing.html">自定义提交器</a>来解决该问题.</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -