本文将为您提供关于googleapp引擎chunkSize和prefetchSize-我在哪里可以阅读有关它的详细信息?的详细介绍,同时,我们还将为您提供关于@ManyToOne和@BatchSize
本文将为您提供关于google app引擎chunkSize和prefetchSize-我在哪里可以阅读有关它的详细信息?的详细介绍,同时,我们还将为您提供关于@ManyToOne和@BatchSize、Apache POI autoSizeColumn不正确resize、cocos2d-x getVisibleSize、getContentSize、getWinSize函数、Hibernate 源码分析之 setFetchSize的实用信息。
本文目录一览:- google app引擎chunkSize和prefetchSize-我在哪里可以阅读有关它的详细信息?
- @ManyToOne和@BatchSize
- Apache POI autoSizeColumn不正确resize
- cocos2d-x getVisibleSize、getContentSize、getWinSize函数
- Hibernate 源码分析之 setFetchSize
google app引擎chunkSize和prefetchSize-我在哪里可以阅读有关它的详细信息?
关于这两个总和的所有信息总计为:
chunkSize
设置块大小。请阅读类javadoc以获取有关如何使用块大小的说明。
prefetchSize
设置要预取的实体数。
尝试查看java
docs和SVN
中的源代码。完全没有信息!我的意思是,有关这两者的实际含义的信息。
好吧,prefetchSize或多或少是很清楚的-运行查询时,要获取多少个实体。
如果我的理解是正确的,例如,如果将查询的限制设置为1000并将prefetchSize设置为1000,它将立即将它们全部读取到内存中。
那chunkSize呢?这是字节大小吗?实体数量?
设置为这两者的低/高数字有什么影响?
答案1
小编典典您链接到的页面顶部显示:
prefetchSize是首次调用数据存储区时检索到的结果数。
chunkSize确定了PreparedQuery.asIterator(FetchOptions)返回的Iterator的内部分块策略以及PreparedQuery.asIterable(FetchOptions)返回的Iterable。
chunkSize
诚然,描述很模糊。它指定要在后续数据存储请求上获取的结果数(在使用完第一个prefetchSize
结果之后)。
@ManyToOne和@BatchSize
我在一些旧代码中发现了奇怪的事情(至少对我而言)。
@ManyToOne
带注释的字段也用注释@BatchSize
。
我一直以为@BatchSize
注释仅在类级别或集合(@OneToMany
)上进行注释时才受影响,而在迭代时则影响 预取 。
但是,也许我错了,并标注@ManyToOne
与@BatchSize
影响的东西。我在文档中找不到答案。
是否标注@ManyToOne
有@BatchSize
有感觉?
答案1
小编典典@ManyToOne``@BatchSize
仅当相应字段标记为lazy
(lazy=true
)时,与关联的内容才有意义。
的确,如果该字段不是lazy
,则根据定义,由于装入了实体,因此该字段已经被加载,因此数据库调用的问题不适用。
想象一下一个Person
类,其中有一个ShoesPair
元素集合(ShoesPair
.class),并且其中一个owner
字段被标记为惰性字段(由于是可选字段,因此在检索特定的鞋子时并没有带来重要的信息)。
一个人想要遍历 25 双鞋(25个ShoesPair
对象)以找回它们的所有者。
如果该owner
字段(对应一个人)仅用注释@ManyToOne
,则数据库中将有 25个 选择。
但是,如果用注释@BatchSize(size=5)
,将只有 5个 调用,因此可以提高性能。
从Hibernate文档中可以看出,批处理大小不仅适用于集合:
您还 可以 启用集合的批量提取。
Hibenate特别提到了一些@OneToMany
案例,因为在90%的案例中,这些字段都标记为lazy
。
Apache POI autoSizeColumn不正确resize
我在Java中使用Apache POI创build一个Excel文件。 我填写数据然后尝试自动化每列,但大小总是错误的(我认为一致)。 前两行总是(?)完全折叠。 当我在Excel中自动调整列时,它完美的工作。
没有空白单元格正在写(我相信),resize是我做的最后一件事情。
下面是相关的代码:这是一个没有error handling等的简化版本
public static synchronized String storeResults(ArrayList<String> resultList,String file) { if (resultList == null || resultList.size() == 0) { return file; } FileOutputStream stream = new FileOutputStream(file); //Create workbook and result sheet XSSFWorkbook book = new XSSFWorkbook(); Sheet results = book.createSheet("Results"); //Write results to workbook for (int x = 0; x < resultList.size(); x++) { String[] items = resultList.get(x).split(PRIM_DELIM); Row row = results.createRow(x); for (int i = 0; i < items.length; i++) { row.createCell(i).setCellValue(items[i]); } } //Auto size all the columns for (x = 0; x < results.getRow(0).getPhysicalNumberOfCells(); x++) { results.autoSizeColumn(x); } //Write the book and close the stream book.write(stream); stream.flush(); stream.close(); return file; }
我知道这里有几个类似的问题,但其中大多数只是填充数据之前的大小的一个例子。 而less数不是更复杂/没有答案。
PHP执行shell命令权限被拒绝
本地开发,Apache与开发人员 – 文件权限
使用Apache Wsgi通过DJANGO_SETTINGS_MODULE环境variables设置Django设置文件
通过Apache上的IP地址限制请求?
使用Apache列入白名单的CORS
编辑:我尝试使用几个不同的字体,它没有工作。 这并不令人感到意外,因为不pipe字体是什么字体,都应该完全崩溃或不应该是。
另外,由于字体问题出现,我在Windows 7上运行该程序。
解决:这是一个字体问题。 我发现的唯一字体是Serif。
.htaccess规则:多个域到一个ssl域
PHP致命错误:require():无法解锁pthread锁
RewriteCond里的%N反向引用
URL缩短网站
mod-rewrite从url中删除文件夹名称
只是为了回应我的意见。 由于Java并不知道你想要使用这个链接的字体,因此如果你想把新的字体安装到Java中,你可以使用一些更好的东西。 它也有Java知道的默认字体的列表。
很高兴这有助于你解决了你的问题!
这可能与这个与Java Bug JDK-8013716相关的POI Bug相关:Calibri和Cambria字体的渲染器自更新45以来失败 。
在这种情况下,更改字体或使用6u45 / 7u21以上的JRE应该可以解决问题。
你也可以通过使用这样的代码来弥补这个问题,并避免列被完全折叠sheet.autoSizeColumn(x); if (sheet.getColumnWidth(x) == 0) { // autosize Failed use MIN_WIDTH sheet.setColumnWidth(x,MIN_WIDTH); } sheet.autoSizeColumn(x); if (sheet.getColumnWidth(x) == 0) { // autosize Failed use MIN_WIDTH sheet.setColumnWidth(x,MIN_WIDTH); }
我也遇到这个问题,这是我的解决方案。
脚步:
创建工作簿
创建电子表格
创建行
创建/设置字体“Arial”
用字体创建/设置样式
用值和样式创建/设置单元格
autoSizeColumn
创建文件
码:
// initialize objects XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet spreadsheet = workbook.createSheet(sheetName); XSSFRow row = spreadsheet.createRow(0); XSSFCell cell; // font/style XSSFFont font = workbook.createFont(); font.setFontName("Arial"); XSSFCellStyle style = workbook.createCellStyle(); style.setFont(font); // create/set cell & style cell = row.createCell(0); cell.setCellValue("New Cell"); cell.setCellStyle(style); // auto size spreadsheet.autoSizeColumn(0); // create file File aFile = new File("Your Filename"); FileOutputStream out = new FileOutputStream(aFile); workbook.write(out);
资源:
http://www.tutorialspoint.com/apache_poi/index.htm
我在Windows 7上有类似的问题。
我使用Calibri字体(在我的JVM中支持)。 使用该字体时, autoSizeColumn() POI方法使用的java.awt.font.TextLayout的getBounds().getWidth()将返回0。
更改字体为Calibri-Regular解决了我的情况下的问题。
这是我的2美分 –
我使用默认的字体(在我的情况下宋体)使用它来使某些字段在XLS粗体。 像在Windows中的魅力一样工作,autoSizeColumn()函数。
Linux不是那么宽容。 自动调整大小是不合适的。 通过这个线程和其他我想出了以下解决方案。
我将Arial字体的.tff文件复制到JAVA / jre / lib / fonts目录中,然后重新运行该应用程序。 工作得很好。
我用Helvetica字体尝试替换Arial字体(实际上,Helvetica与Arial类似)。
XSSFFont font = wb.createFont(); font.setFontName("Helvetica");
当最宽的字符串以空格开始时,我发现自动调整大小没有使列宽足够,例如
cell.setCellValue(" New Cell");
这可以通过使用缩进来解决,例如
// font/style XSSFFont font = workbook.createFont(); font.setFontName("Arial"); XSSFCellStyle style = workbook.createCellStyle(); style.setFont(font); style.setIndention((short)2); // create/set cell & style cell = row.createCell(0); cell.setCellValue("New Cell"); cell.setCellStyle(style); // auto size spreadsheet.autoSizeColumn(0);
cocos2d-x getVisibleSize、getContentSize、getWinSize函数
在cocos2d-x里CCNode对象有缩放的方法setScaleX和setScaleY。所以在获取对象大小的时候必须根据情况明确指定获取对象原始大小,还是缩放后的大小。
cocos2d::Size size1 = cocos2d::CCDirector::getInstance()->getWinSize(); float scaleX=size1.width/768; float scaleY=size1.height/1024; Sprite *sp1=Sprite::create("01.png"); sp1->setScaleX(scaleX); sp1->setScaleY(scaleY); this->addChild(sp1);
getVisibleSize:获得可视区域的大小,若是DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize便是getWinSize。
getVisibleOrigin:获得可视区域的出发点坐标,在处理相对位置时,确保节点在不同分辨率下的位置一致。
getContentSize函数来获得节点原始的大小。只是逻辑尺寸,不是像素
假如使用一张图创建了一个精灵,图片的大小120*120,缩放先后通过getContentSize获取的大小不变,
在精灵进行缩放后,你的精灵图片变化了,这时候你见到的是可见的visibleSize,而getContentSize,是获取它实际的图片
getContentSizeInPixels获得的是像素点大小 P.S.像素点和逻辑点关系:逻辑点大小 = 像素大小/contentScaleFactor. //像素:图像由一个个点组成,这个点叫做像素
Hibernate 源码分析之 setFetchSize
JDBC 的 statement 对象,有一个 setFetchSize 方法,参数是一个 int 值,其作用是,执行查询时,一次从服务器端拿多少行的数据到本地 jdbc 客户端这里来
还有一个方法:setMaxRows,这个方法,作用是 JDBC 最多返回多少行数据给调用者。举个例子:
一个表,有 100 行数据,sql 语句为 select * from table,fetchsize 设置为 20,maxrows 设置为 50,则:
数据库服务器端在执行这个查询的时候,会在内部维护一个游标 (hander), 调用者在执行 resultset.next () 的时候,JDBC 会先与服务器端进行通信,取 20 条数据到 jdbc 的客户端中,然后返回第一条给调用者,当调用者取到第 21 条数据的时候,又会触发 jdbc 到数据库服务端拿数据,又拿 20 条,返回第 21 条给调用者。。。当调用者要拿第 41 条数据的时候,jdbc 这时不是去数据库服务器端拿 20 条了,而是 10 条,因为 maxrows 为 50,最多取 50,之前已经取出 40 条了,所以只剩 10 条可取。
为什么要设置 fetchsize? 显然,这样设置,就避免了服务器一下子把所有结果都塞到客户端来了,将客户端的内存资源给撑爆掉了。比如:一行数据就是 100M 大小,如果 JDBC 一下子取 50 条,就需要 5G 的内存,而每次取 10 条,那么,就只需要 1G 内存就可以了,客户端的资源将变的可控!
上面解释了 fetchsize 参数的作用,下面说下我遇到的坑:
在做 postgresql 的 jdbc 的一些测试的时候,发现 fetchsize 无论设置多少,都不生效,照样一次把所有的结果都从服务器端拿到本地内存中,然后返回给应用程序服务。。。。
没办法,就从 https://github.com/pgjdbc 上将 postgresql 的 jdbc 的源代码拿下来研究了下,终于发现了一些蛛丝马迹:
org.postgresql.core.v3.QueryExecutorImpl 的 sendOneQuery 方法中,有如下代码:
[java] view plain copy 1.else if (!usePortal)
2. {
3. rows = maxRows; // Not using a portal -- fetchSize is irrelevant
4. }
注释写的很清楚:当!usePortal 时,要获取的行数,直接等于 maxRows,而不考虑 fetchSize 这个值到底是多少,也就是说,fetchSize 被直接忽略了。。。
那么,什么时候 usePortal 这个变量为 false 呢?(触发了 fetchSize 失效),继续看这个变量的赋值:
[java] view plain copy 1.boolean usePortal = (flags & QueryExecutor.QUERY_FORWARD_CURSOR) != 0 && !noResults && !noMeta && fetchSize > 0 && !describeOnly;
这么多条件,只要一个成立,fetchSize 就失效了:
!noResults 表示这个 SQL 不需要返回任何结果,这个肯定等于 true,因为所有的 select 都会要求返回结果
!noMeta 表示这个 SQL 不需要返回元数据,这个肯定等于 true,因为 select 都要求返回元数据,供后续的 resultSet.get 使用
!fetchSize 大于 0,这个不说了,自然是 true
!describeOnly, 这个只有在 desc table 这样的语句的时候,才会是 false,对于 select,也是 true
那么,试下的唯一的可能导致 usePortal 为 false 的原因就是 flags & queryExecutor.QUERY_FORWARD_CURSOR 这个值等于 0 了。。
继续往上翻,看看什么时候才不会执行 flags = flags | QueryExecutor.QUERY_FORWARD_CURSOR 这个代码了,因为只有这个代码没有被执行过,才会导致上面这个条件为 false
然后将代码定位到了 AbstractJdbc2Statement 类的 execute 方法:
[java] view plain copy 1.// Enable cursor-based resultset if possible.
2. if (fetchSize > 0 && !wantsScrollableResultSet() && !connection.getAutoCommit() && !wantsHoldableResultSet())
3. flags |= QueryExecutor.QUERY_FORWARD_CURSOR;
其中:wantsHoldableResultSet()代码直接返回的 false,所以,不考虑这个,
那么,要么 wantsScrollableResultSet () 返回 true,或者 connection.getAutoCommit () 返回 true,才会导致 flags 不包含 QueryExecutor.QUERY_FORWARD_CURSOR,才会导致 fetchSize 失效
wantsScrollableResultSet () 这个方法的代码为:
[java] view plain copy 1.protected boolean wantsScrollableResultSet() {
2. return resultsettype != ResultSet.TYPE_FORWARD_ONLY;
3. }
至此,问题已经被最终定位到: 1、如果 connection 是自动提交事务的,那么,fetchSize 将失效
2、如果 statement 不是 TYPE_FORWARD_ONLY 的,那么,fetchSize 也将失效
结论:
如果想 fetchSize 生效,必须保证 connection 是 autocommit = false 的,并且,statement 为 forward_only 的:
[java] view plain copy 1.conn.setAutoCommit(false);
2.final Statement statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.FETCH_FORWARD);
另外,不带参数的
conn.createStatement (),其默认就是 TYPE_FORWARD_ONLY
所以,一般情况下,如果想 fetchsize 生效,必须设置 autocommit 为 flase,也就是需要手工去管理事务。
再另外说下,在 ORACLE 的 JDBC 中,没这个坑,默认 fetchsize 为 10:
https://docs.oracle.com/cd/E11882_01/java.112/e16548/resltset.htm#JJDBC28621
在 mysql 的 jdbc 中,必须设置 fetchsize 为 Integer.MIN_VALUE, 这样 JDBC 就一行一行的从服务器端拿数据,它不支持其他大小的 fetchsize:
http://stackoverflow.com/questions/20496616/fetchsize-in-resultset-set-to-0-by-default
备注:本次测试用的 PostgreSQL 的 JDBC 的版本为:
[html] view plain copy 1.<dependency>
2. <groupId>org.postgresql</groupId>
3. <artifactId>postgresql</artifactId>
4. <version>9.3-1102-jdbc4</version>
5. </dependency>
我们今天的关于google app引擎chunkSize和prefetchSize-我在哪里可以阅读有关它的详细信息?的分享已经告一段落,感谢您的关注,如果您想了解更多关于@ManyToOne和@BatchSize、Apache POI autoSizeColumn不正确resize、cocos2d-x getVisibleSize、getContentSize、getWinSize函数、Hibernate 源码分析之 setFetchSize的相关信息,请在本站查询。
本文标签: